এই দুটি উদাহরণ সমতুল্য এবং বাস্তবে একই বাইটকোডে সংকলন করবে।
আপনার প্রথম উদাহরণ হিসাবে একটি পদ্ধতিতে একটি সীমাবদ্ধ জেনেরিক প্রকার যুক্ত করা যে কোনও কিছু করবে এমন দুটি উপায় রয়েছে।
টাইপ প্যারামিটার অন্য ধরণের পাস করা
এই দুটি পদ্ধতির স্বাক্ষরগুলি বাইট কোডে একই হয়ে যায় তবে সংকলকটি সুরক্ষা কার্যকর করে:
public static <T extends Animal> void addAnimals(Collection<T> animals)
public static void addAnimals(Collection<Animal> animals)
প্রথম ক্ষেত্রে, কেবলমাত্র একটি Collection(বা উপ-টাইপ) Animalঅনুমোদিত। দ্বিতীয় ক্ষেত্রে, Collectionজেনেরিক ধরণের বা উপ-টাইপযুক্ত একটি (বা সাব টাইপ) Animalঅনুমোদিত।
উদাহরণস্বরূপ, নিম্নলিখিতটি প্রথম পদ্ধতিতে অনুমোদিত তবে দ্বিতীয়টি নয়:
List<Cat> cats = new ArrayList<Cat>();
cats.add(new Cat());
addAnimals(cats);
কারণটি হ'ল দ্বিতীয়টি কেবলমাত্র প্রাণী সংগ্রহের অনুমতি দেয়, যখন প্রথমটি প্রাণীতে নির্ধারিত কোনও বস্তুর (যেমন সাবটাইপস) সংগ্রহের অনুমতি দেয়। মনে রাখবেন যে এই তালিকাটি যদি এমন একটি প্রাণীর তালিকা ছিল যা বিড়াল ধারণ করে, তবে যে কোনও পদ্ধতি এটি গ্রহণ করবে: ইস্যুটি সংগ্রহের জেনেরিক স্পেসিফিকেশন, এটি আসলে কী রয়েছে তা নয়।
প্রত্যাবর্তন অবজেক্টস
অন্য সময় এটি গুরুত্বপূর্ণ জিনিসগুলি ফিরে আসার সাথে। আসুন ধরে নেওয়া যাক নিম্নলিখিত পদ্ধতিটি বিদ্যমান ছিল:
public static <T extends Animal> T feed(T animal) {
animal.eat();
return animal;
}
আপনি এটি দিয়ে নিম্নলিখিতটি করতে সক্ষম হবেন:
Cat c1 = new Cat();
Cat c2 = feed(c1);
যদিও এটি একটি স্বীকৃত উদাহরণ, এমন কিছু ঘটনা রয়েছে যেখানে এটি অর্থবোধ করে। জেনেরিক ব্যতীত, পদ্ধতিটি ফিরে আসতে হবে Animalএবং এটির কাজ করতে আপনাকে টাইপ কাস্টিং যুক্ত করতে হবে (যা সংকলক যাই হোক না কেন পর্দার পিছনে বাইট কোড যুক্ত করে)।
addAnimals(List<Animal>)বিড়ালের তালিকা লিখতে এবং যুক্ত করার চেষ্টা করুন !