"Merhaba! Ellie'nin jeneriklerle ilgili dersine devam edeceğim. Dinlemeye hazır mısın?"

"Evet."

"Öyleyse başlayalım."

"Bilmeniz gereken ilk şey, bir sınıfın yöntemlerinin de kendi tür parametrelerine sahip olabileceğidir."

"Biliyorum."

"Hayır, özellikle kendi tür parametrelerini kastediyorum : "

Örnek
class Calculator
{
  T add(T a, T b); // Add
  T sub(T a, T b); // Subtract
  T mul(T a, T b); // Multiply
  T div(T a, T b); // Divide
}

"Bu tür parametreler, özellikle yöntemlerle ilgilidir. Sınıfın parametreleri yoktur. Hatta bu yöntemleri statik olarak ilan edebilir ve bir nesne olmadan çağırabilirsiniz."

"Anlıyorum. Yöntemlerdeki tür parametrelerinin amacı, sınıflarla aynı mı?"

"Evet. Ama yeni bir şey var."

"Bildiğiniz gibi, tür bildiriminde bir joker karakter kullanabilirsiniz. Sonra aşağıdaki durumu hayal edin:"

örnek 1
public void doSomething(List<? extends MyClass> list)
{
 for(MyClass object : list)
 {
  System.out.println(object.getState()); // Everything works well here.
 }
}

"Ama ya koleksiyona yeni bir öğe eklemek istiyorsak:"

Örnek 2
public void doSomething(List<? extends MyClass> list)
{
 list.add(new MyClass()); // Error!
}

"Sorun şu ki, genel durumda doSomething yöntemi, öğeleri Sınıfım nesneleri değil, Sınıfım'ın herhangi bir alt sınıfının nesneleri olan bir Listeye geçirilebilir. Ancak, böyle bir listeye Sınıfım nesneleri ekleyemezsiniz!"

"Ah. Peki, bu konuda ne yapılabilir?"

"Hiçbir şey. Bu durumda hiçbir şey yapamazsınız. Ancak bu, Java'nın yaratıcılarına düşünecek bir şey verdi. Ve yeni bir anahtar kelime buldular: süper ."

"Sözdizimi neredeyse aynı görünüyor:"

List<? super MyClass> list

Ancak, uzantılar ve süper arasında önemli bir ayrım vardır.

"«? T'yi uzatır», sınıfın T'nin soyundan gelmesi gerektiği anlamına gelir.

"«? süper T», sınıfın T'nin atası olması gerektiği anlamına gelir."

"Vay canına. Peki bu nerede kullanılıyor?"

"«? süper T», bir yöntem bir T nesneleri koleksiyonuna eklemeyi içerdiğinde kullanılır. Bu durumda, bu, T nesnelerinin bir koleksiyonu veya T'nin herhangi bir atası olabilir.

"Ah. AT nesnesi, türü T'nin atalarından herhangi biri olan bir referans değişkenine atanabilir"

"Açıkçası bu yaklaşım çok sık kullanılmıyor. Üstelik bir eksiği var. Örneğin:"

örnekler
public void doSomething(List<? super MyClass> list)
{
 for(MyClass object : list) // Error!
 {
  System.out.println(object.getState());
 }
}
public void doSomething(List<? super MyClass> list)
{
 list.add(new MyClass()); // Everything works well here.
}

"Şimdi ilk örnek çalışmıyor."

"Liste bir List<Object> bile olabileceğinden (Object, MyClass'ın en üst üst sınıfıdır), esasen aşağıdaki geçersiz kodu yazıyoruz:"

örnek 1
List<Object> list; 

for(MyClass object : list) // Error!
{ 
 System.out.println(object.getState()); 
}

"Anlıyorum. İlginç ders için teşekkürler."

"Rica ederim."