উত্তর:
প্রসঙ্গ থেকে বিচ্ছিন্ন - কোন পার্থক্য। উভয় t
এবং obj
আপনি কেবল এর পদ্ধতি গ্রহণ করতে পারেন Object
।
তবে প্রসঙ্গে - আপনার যদি জেনেরিক শ্রেণি থাকে:
MyClass<Foo> my = new MyClass<Foo>();
Foo foo = new Foo();
তারপর:
Foo newFoo = my.doSomething(foo);
অবজেক্ট সহ একই কোড
Foo newFoo = (Foo) my.doSomething(foo);
দুটি সুবিধা:
Object
সংস্করণটি ব্যবহৃত হয় তবে আপনি নিশ্চিত হন না যে পদ্ধতিটি সর্বদা ফিরে আসে Foo
। যদি এটি ফিরে আসে Bar
, ClassCastException
রানটাইমে আপনার একটি থাকবে ।এখানে পার্থক্যটি হ'ল প্রথমটিতে, আমরা উল্লেখ করেছি যে কলারকে অবশ্যই একটি অবজেক্ট উদাহরণ (যে কোনও শ্রেণি) পাস করতে হবে এবং এটি অন্য কোনও অবজেক্ট (কোনও শ্রেণি, একই ধরণের অগত্যা নয়) ফিরে পাবে।
দ্বিতীয়টিতে, পাঠানো টাইপটি শ্রেণীর সংজ্ঞায়িত করার সময় প্রদত্ত একই ধরণের হবে।
Example ex = new Example<Integer>();
এখানে আমরা কী ধরণের টি হবে তা নির্দিষ্ট করে যা আমাদের ক্লাস বা পদ্ধতিতে আরও বাধা প্রয়োগ করতে দেয়। উদাহরণস্বরূপ আমরা একটি LinkedList<Integer>
বা তাত্ক্ষণিক করতে পারি LinkedList<Example>
এবং আমরা জানি যে আমরা যখন এই পদ্ধতির কোনওটিকে কল করি তখন আমরা একটি পূর্ণসংখ্যা বা উদাহরণ উদাহরণটি ফিরে পাই।
এখানে মূল লক্ষ্য হ'ল কলিং কোডটি প্রয়োগ করতে টাইপ-কাস্টিংয়ের উপর নির্ভর না করে কোন শ্রেণীর কোন ধরণের অবজেক্টগুলি পরিচালনা করবে তা নির্দিষ্ট করতে পারে।
ওরাকল থেকে জাভা জেনারিকস * দেখুন ।
* আপডেট লিঙ্ক।
পার্থক্যটি হ'ল জেনেরিক পদ্ধতিগুলির সাথে আমার কাস্ট করার দরকার নেই এবং আমি ভুল করলে আমার সংকলন ত্রুটি হয়:
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;
}
}
আপনার অতিরিক্ত ক্লাস কাস্টিং করার দরকার নেই। প্রথম ক্ষেত্রে আপনি সর্বদা বর্গ java.lang.Object ক্লাসের একটি অবজেক্ট পাবেন যা আপনার ক্লাসে কাস্ট করতে হবে। দ্বিতীয় ক্ষেত্রে টি জেনেরিক স্বাক্ষরে সংজ্ঞায়িত শ্রেণীর সাথে প্রতিস্থাপন করা হবে এবং কোনও শ্রেণীর ingালাই প্রয়োজন হবে না।
টি একটি জেনেরিক প্রকার। অর্থ এটি রানটাইম সময়ে যে কোনও যোগ্যতাযুক্ত বস্তুর দ্বারা প্রতিস্থাপিত হতে পারে। আপনি নীচের মত একটি পদ্ধতি অনুরোধ করতে পারেন:
String response = doSomething("hello world");
অথবা
MyObject response = doSomething(new MyObject());
অথবা
Integer response = doSomething(31);
আপনি দেখতে পাচ্ছেন যে এখানে পলিমারফিজম রয়েছে।
তবে যদি এটি অবজেক্টটিকে ফেরত ঘোষণা করা হয়, আপনি কাস্ট জিনিসগুলি টাইপ না করে আপনি এটি করতে পারবেন না।
<T>
সেখানে কোনও অটোবক্সিং নেই?
প্রথম ক্ষেত্রে এটি যে কোনও প্রকারের ইস্ট্রস্ট্রিংয়ের একটি প্যারামিটার নেয় এবং কোনও প্রকারের foo প্রদান করে। দ্বিতীয় ক্ষেত্রে এটি টাইপ foo এর প্যারামিটার নেয় এবং foo টাইপের কোনও বস্তু দেয়।
জাভাতে অবজেক্ট টাইপের উপর জেনেরিক্স বিবেচনা করতে পারেন এমন কয়েকটি কারণ রয়েছে: