আমরা কেবল জানি " কোনও শ্রেণীর সমস্ত উদাহরণ একই জাভা.এল. শেয়ার করে that ধরণের শ্রেণীর ক্লাস অবজেক্ট "
যেমন)
Student a = new Student();
Student b = new Student();
তাহলে a.getClass() == b.getClass()
সত্য।
এখন ধরে নিন
Teacher t = new Teacher();
জেনারিক ব্যতীত নীচে সম্ভব।
Class studentClassRef = t.getClass();
তবে এটা এখন ভুল ..?
যেমন) সাথে কল করা public void printStudentClassInfo(Class studentClassRef) {}
যেতে পারেTeacher.class
এটি জেনেরিক ব্যবহার এড়ানো যায়।
Class<Student> studentClassRef = t.getClass(); //Compilation error.
এখন টি কি ?? টি হ'ল টাইপ প্যারামিটার (একে টাইপ ভেরিয়েবলও বলা হয়); কোণ বন্ধনী (<>) দ্বারা সীমিত, শ্রেণীর নাম অনুসরণ করে।
টি ক্লাস ফাইলটি লেখার সময় ঘোষিত ভেরিয়েবল নামের (যে কোনও নাম হতে পারে) এর মতো কেবল একটি প্রতীক। পরবর্তীতে টি
আরম্ভের সময় বৈধ শ্রেণীর নামের সাথে প্রতিস্থাপিত হবে ( HashMap<String> map = new HashMap<String>();
)
যেমন) class name<T1, T2, ..., Tn>
সুতরাং Class<T>
নির্দিষ্ট শ্রেণীর ধরণের ' T
' এর একটি শ্রেণি অবজেক্টকে উপস্থাপন করে ।
ধরে নিন যে আপনার শ্রেণি পদ্ধতিতে নীচের মতো অজানা টাইপের প্যারামিটারগুলির সাথে কাজ করতে হবে
/**
* Generic version of the Car class.
* @param <T> the type of the value
*/
public class Car<T> {
// T stands for "Type"
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
এখানে টি কারনেমের মতো String
টাইপ হিসাবে ব্যবহার করা যেতে পারে
বা টি মডেল নাম্বার হিসাবে Integer
টাইপ হিসাবে ব্যবহার করা যেতে পারে ,
বা টি টি বৈধ গাড়ী উদাহরণ হিসাবে Object
টাইপ হিসাবে ব্যবহার করা যেতে পারে ।
এখন এখানে উপরেরটি সরল POJO যা রানটাইম সময়ে বিভিন্নভাবে ব্যবহার করা যেতে পারে।
সংগ্রহগুলি উদাহরণস্বরূপ) তালিকা, সেট, হাশম্যাপ সেরা উদাহরণ যা টি এর ঘোষণাপত্র অনুসারে বিভিন্ন অবজেক্টের সাথে কাজ করবে, তবে একবার আমরা টি স্ট্রিং
যেমন হিসাবে ঘোষণা করলাম
) HashMap<String> map = new HashMap<String>();
তারপরে এটি কেবল স্ট্রিং ক্লাস উদাহরণ বস্তুগুলি গ্রহণ করবে।
জেনেরিক পদ্ধতি
জেনেরিক পদ্ধতিগুলি এমন পদ্ধতি যা তাদের নিজস্ব ধরণের পরামিতিগুলি প্রবর্তন করে। এটি জেনেরিক প্রকারের ঘোষণার মতো, তবে প্রকারের প্যারামিটারের ক্ষেত্রটি যেখানে ঘোষিত হয় সেই পদ্ধতিতে সীমাবদ্ধ। স্ট্যাটিক এবং নন-স্ট্যাটিক জেনেরিক পদ্ধতিগুলির পাশাপাশি জেনেরিক শ্রেণির নির্মাতারা অনুমোদিত।
জেনেরিক পদ্ধতির সিনট্যাক্সে একটি ধরণের প্যারামিটার, কোণ বন্ধনীগুলির অভ্যন্তরে অন্তর্ভুক্ত থাকে এবং পদ্ধতিটির রিটার্ন টাইপের আগে উপস্থিত হয়। জেনেরিক পদ্ধতির জন্য, টাইপ প্যারামিটার বিভাগটি পদ্ধতির রিটার্ন টাইপের আগে উপস্থিত হওয়া উচিত।
class Util {
// Generic static method
public static <K, V, Z, Y> boolean compare(Pair<K, V> p1, Pair<Z, Y> p2) {
return p1.getKey().equals(p2.getKey()) &&
p1.getValue().equals(p2.getValue());
}
}
class Pair<K, V> {
private K key;
private V value;
}
এখানে <K, V, Z, Y>
পদ্ধতি আর্গুমেন্ট ব্যবহৃত ধরনের ঘোষণা যা উচিত রিটার্ন টাইপ যা আগে boolean
এখানে।
নীচে; ধরণের ঘোষণাপত্রটি <T>
পদ্ধতি স্তরে প্রয়োজন হয় না, কারণ এটি ইতিমধ্যে শ্রেণি পর্যায়ে ঘোষণা করা হয়েছে।
class MyClass<T> {
private T myMethod(T a){
return a;
}
}
ক্লাস-লেভেল ধরণের প্যারামিটারগুলি কে, ভি, জেড এবং ওয়াই স্থির প্রসঙ্গে (এখানে স্থির পদ্ধতি) ব্যবহার করা যাবে না বলে নীচে ভুল।
class Util <K, V, Z, Y>{
// Generic static method
public static boolean compare(Pair<K, V> p1, Pair<Z, Y> p2) {
return p1.getKey().equals(p2.getKey()) &&
p1.getValue().equals(p2.getValue());
}
}
অন্যান্য ভ্যালিড স্কিনিয়ারস হয়
class MyClass<T> {
//Type declaration <T> already done at class level
private T myMethod(T a){
return a;
}
//<T> is overriding the T declared at Class level;
//So There is no ClassCastException though a is not the type of T declared at MyClass<T>.
private <T> T myMethod1(Object a){
return (T) a;
}
//Runtime ClassCastException will be thrown if a is not the type T (MyClass<T>).
private T myMethod1(Object a){
return (T) a;
}
// No ClassCastException
// MyClass<String> obj= new MyClass<String>();
// obj.myMethod2(Integer.valueOf("1"));
// Since type T is redefined at this method level.
private <T> T myMethod2(T a){
return a;
}
// No ClassCastException for the below
// MyClass<String> o= new MyClass<String>();
// o.myMethod3(Integer.valueOf("1").getClass())
// Since <T> is undefined within this method;
// And MyClass<T> don't have impact here
private <T> T myMethod3(Class a){
return (T) a;
}
// ClassCastException for o.myMethod3(Integer.valueOf("1").getClass())
// Should be o.myMethod3(String.valueOf("1").getClass())
private T myMethod3(Class a){
return (T) a;
}
// Class<T> a :: a is Class object of type T
//<T> is overriding of class level type declaration;
private <T> Class<T> myMethod4(Class<T> a){
return a;
}
}
এবং পরিশেষে স্থির পদ্ধতিতে সর্বদা সুস্পষ্ট <T>
ঘোষণার প্রয়োজন হয়; এটি শ্রেণি স্তর থেকে প্রাপ্ত হবে না Class<T>
। এটি ক্লাস স্তর টির কারণে উদাহরণের সাথে আবদ্ধ।
জেনারিক্সের উপর বিধিনিষেধগুলিও পড়ুন
ওয়াইল্ডকার্ডস এবং সাব টাইপিং
জেনেরিক পদ্ধতির জন্য যুক্তি টাইপ করুন