জাভা জেনেরিকস টি বনাম অবজেক্ট


127

আমি ভাবছিলাম যে নিম্নলিখিত দুটি পদ্ধতির ঘোষণার মধ্যে পার্থক্য কী:

public Object doSomething(Object obj) {....}

public <T> T doSomething(T t) {....}

এমন কিছু আছে যা আপনি একজনের সাথে করতে পারবেন / অন্যটির সাথে নয়? এই প্রশ্নটি আমি এই সাইটে অন্য কোথাও খুঁজে পাইনি।

উত্তর:


112

প্রসঙ্গ থেকে বিচ্ছিন্ন - কোন পার্থক্য। উভয় tএবং objআপনি কেবল এর পদ্ধতি গ্রহণ করতে পারেন Object

তবে প্রসঙ্গে - আপনার যদি জেনেরিক শ্রেণি থাকে:

MyClass<Foo> my = new MyClass<Foo>();
Foo foo = new Foo();

তারপর:

Foo newFoo = my.doSomething(foo);

অবজেক্ট সহ একই কোড

Foo newFoo = (Foo) my.doSomething(foo);

দুটি সুবিধা:

  • ingালাইয়ের দরকার নেই (সংকলক এটি আপনার কাছ থেকে লুকায়)
  • সময় সুরক্ষা কাজ করে যে কম্পাইল। যদি Objectসংস্করণটি ব্যবহৃত হয় তবে আপনি নিশ্চিত হন না যে পদ্ধতিটি সর্বদা ফিরে আসে Foo। যদি এটি ফিরে আসে Bar, ClassCastExceptionরানটাইমে আপনার একটি থাকবে ।

14

এখানে পার্থক্যটি হ'ল প্রথমটিতে, আমরা উল্লেখ করেছি যে কলারকে অবশ্যই একটি অবজেক্ট উদাহরণ (যে কোনও শ্রেণি) পাস করতে হবে এবং এটি অন্য কোনও অবজেক্ট (কোনও শ্রেণি, একই ধরণের অগত্যা নয়) ফিরে পাবে।

দ্বিতীয়টিতে, পাঠানো টাইপটি শ্রেণীর সংজ্ঞায়িত করার সময় প্রদত্ত একই ধরণের হবে।

Example ex = new Example<Integer>();

এখানে আমরা কী ধরণের টি হবে তা নির্দিষ্ট করে যা আমাদের ক্লাস বা পদ্ধতিতে আরও বাধা প্রয়োগ করতে দেয়। উদাহরণস্বরূপ আমরা একটি LinkedList<Integer>বা তাত্ক্ষণিক করতে পারি LinkedList<Example>এবং আমরা জানি যে আমরা যখন এই পদ্ধতির কোনওটিকে কল করি তখন আমরা একটি পূর্ণসংখ্যা বা উদাহরণ উদাহরণটি ফিরে পাই।

এখানে মূল লক্ষ্য হ'ল কলিং কোডটি প্রয়োগ করতে টাইপ-কাস্টিংয়ের উপর নির্ভর না করে কোন শ্রেণীর কোন ধরণের অবজেক্টগুলি পরিচালনা করবে তা নির্দিষ্ট করতে পারে।

ওরাকল থেকে জাভা জেনারিকস * দেখুন ।

* আপডেট লিঙ্ক।


13

পার্থক্যটি হ'ল জেনেরিক পদ্ধতিগুলির সাথে আমার কাস্ট করার দরকার নেই এবং আমি ভুল করলে আমার সংকলন ত্রুটি হয়:

public class App {

    public static void main(String[] args) {

        String s = process("vv");
        String b = process(new Object()); // Compilation error
    }

    public static <T> T process(T val) {

        return val;
    }
}

অবজেক্টটি ব্যবহার করে আমার সর্বদা castালাই করা প্রয়োজন এবং আমি ভুল করলে আমার কোনও ত্রুটি হয় না:

public class App {

    public static void main(String[] args) {

        String s = (String)process("vv");
        String b = (String)process(new Object());
    }

    public static Object process(Object val) {

        return val;
    }
}

কেবল অ্যানড্রইড
জন লর্ড

2

আপনার অতিরিক্ত ক্লাস কাস্টিং করার দরকার নেই। প্রথম ক্ষেত্রে আপনি সর্বদা বর্গ java.lang.Object ক্লাসের একটি অবজেক্ট পাবেন যা আপনার ক্লাসে কাস্ট করতে হবে। দ্বিতীয় ক্ষেত্রে টি জেনেরিক স্বাক্ষরে সংজ্ঞায়িত শ্রেণীর সাথে প্রতিস্থাপন করা হবে এবং কোনও শ্রেণীর ingালাই প্রয়োজন হবে না।


2

রানটাইমের সময় কিছুই নেই। তবে সংকলনের সময় দ্বিতীয়টি টাইপ চেকিং করবে প্যারামিটারের ধরন এবং রিটার্ন ভ্যালু ম্যাচের ধরণটি (বা উপ-প্রকারের) টাইপ টি যেভাবেই সমাধান করে (প্রথম উদাহরণে টাইপ চেকিংও করে তবে প্রতিটি বস্তু একটি অবজেক্টের সাব টাইপ তাই প্রতিটি প্রকার গ্রহণযোগ্য হবে)।


2

টি একটি জেনেরিক প্রকার। অর্থ এটি রানটাইম সময়ে যে কোনও যোগ্যতাযুক্ত বস্তুর দ্বারা প্রতিস্থাপিত হতে পারে। আপনি নীচের মত একটি পদ্ধতি অনুরোধ করতে পারেন:

String response = doSomething("hello world");

অথবা

MyObject response = doSomething(new MyObject());

অথবা

Integer response = doSomething(31);

আপনি দেখতে পাচ্ছেন যে এখানে পলিমারফিজম রয়েছে।

তবে যদি এটি অবজেক্টটিকে ফেরত ঘোষণা করা হয়, আপনি কাস্ট জিনিসগুলি টাইপ না করে আপনি এটি করতে পারবেন না।


আমরা কি বলতে পারি যে <T>সেখানে কোনও অটোবক্সিং নেই?
এসএমইউসামশাহ

0

প্রথম ক্ষেত্রে এটি যে কোনও প্রকারের ইস্ট্রস্ট্রিংয়ের একটি প্যারামিটার নেয় এবং কোনও প্রকারের foo প্রদান করে। দ্বিতীয় ক্ষেত্রে এটি টাইপ foo এর প্যারামিটার নেয় এবং foo টাইপের কোনও বস্তু দেয়।


0

জাভাতে অবজেক্ট টাইপের উপর জেনেরিক্স বিবেচনা করতে পারেন এমন কয়েকটি কারণ রয়েছে:

  1. জেনারিকস নমনীয় এবং নিরাপদ। একই সময়ে, অবজেক্টের সাথে কাজ করা যাতে টাইপ-কাস্টিংয়ের প্রয়োজন হয় তা ত্রুটি-প্রবণ
  2. জাভাতে টাইপ কাস্টিং ধীর গতির: [1]: https://www.infoworld.com/article/2076555/java-performance-programming--part-2---cost-of-casting.html
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.