Bu iki örnek eşdeğerdir ve aslında aynı bayt koduyla derlenir.
İlk örneğinizdeki gibi bir yönteme sınırlı bir genel tür eklemenin her şeyi yapmasının iki yolu vardır.
Type parametresini başka bir türe geçirme
Bu iki yöntem imzası bayt kodunda aynı olur, ancak derleyici tür güvenliğini zorunlu kılar:
public static <T extends Animal> void addAnimals(Collection<T> animals)
public static void addAnimals(Collection<Animal> animals)
İlk durumda, sadece bir Collection
(veya alt tip) Animal
'e izin verilir. İkinci durumda, Collection
genel tipte veya alt tipte bir (veya alt tip) Animal
izin verilir.
Örneğin, ilk yöntemde aşağıdakilere izin verilir ancak ikincisinde izin verilmez:
List<Cat> cats = new ArrayList<Cat>();
cats.add(new Cat());
addAnimals(cats);
Bunun nedeni, ikincisinin sadece hayvanların toplanmasına izin vermesi, birincisi ise hayvana atanabilen herhangi bir nesnenin (yani alt tipler) toplanmasına izin vermesidir. Bu liste bir kedi içeren hayvanların bir listesi olsaydı, her iki yöntemin de kabul edeceğini unutmayın: sorun, koleksiyonun aslında içerdiği değil genel jenerasyonudur.
Nesneleri döndürme
Diğer önemli zaman dönen nesnelerle. Aşağıdaki yöntemin var olduğunu varsayalım:
public static <T extends Animal> T feed(T animal) {
animal.eat();
return animal;
}
Onunla aşağıdakileri yapabilirsiniz:
Cat c1 = new Cat();
Cat c2 = feed(c1);
Bu tartışmalı bir örnek olsa da, mantıklı olduğu durumlar vardır. Jenerikler olmadan, yöntemin geri dönmesi Animal
gerekir ve çalışmasını sağlamak için tür dökümü eklemeniz gerekir (derleyici yine de sahne arkasındaki bayt koduna ekler).
addAnimals(List<Animal>)
bir Kedi Listesi yazmayı ve eklemeyi deneyin !