ตัวอย่างสองตัวอย่างนี้มีค่าเท่ากันและในความเป็นจริงจะรวมเป็นรหัสไบต์เดียวกัน
มีสองวิธีที่การเพิ่มประเภททั่วไปที่ถูกผูกไว้กับวิธีการในตัวอย่างแรกของคุณจะทำอะไร
ผ่านพารามิเตอร์ประเภทไปยังประเภทอื่น
ลายเซ็นวิธีการทั้งสองนี้จบลงด้วยการเหมือนกันในรหัสไบต์ แต่คอมไพเลอร์บังคับใช้ความปลอดภัยของประเภท:
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>)
และเพิ่ม List of Cats!