"Şimdi yeni ve ilginç bir konuya geçelim: joker karakterler."

"Aslında bu, herhangi bir şeyle eşleşen bir "*" kalıbı gibi bir şey."

"Ama en baştan başlayalım."

"Bir Savaşçı sınıfınız ve iki savaşçıdan hangisinin daha güçlü olduğunu belirleyen bir yönteminiz olduğunu hayal edin. İşte böyle görünebilir:"

örnek 1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }
}
Örnek yöntem çağrısı
MagicWarrior mag = new MagicWarrior();
ArcherWarrior archer = new ArcherWarrior();

boolean isMagicCooler = WarriorManager.fight(mag, archer);

"MagicWarrior ve ArcherWarrior, Warrior'ı devralır . "

"Biraz basit, ama bir örnek için, yapacak."

"TAMAM."

"Şimdi birden fazla savaşçının savaşa katıldığı durum için benzer bir yöntem yapmaya karar verdiğinizi varsayalım."

örnek 1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }

 public static boolean fight(List<Warrior> w1, List<Warrior> w2)
 {
  return 
 }
}
Örnek yöntem çağrısı
ArrayList<MagicWarrior> magi = new ArrayList<MagicWarrior>();
for(int i = 0; i < 10; i++)
 magi.add(new MagicWarrior());

ArrayList<ArcherWarrior> archers = new ArrayList<ArcherWarrior>();
for(int i = 0; i < 10; i++)
 archers.add(new ArcherWarrior());

boolean isMagicCooler = WarriorManager.fight(magi, archers); // Compilation error!

"Ama burada bir derleme hatasıyla karşılaşıyorsunuz ve neyin yanlış olabileceği konusunda şaşkınsınız."

"Mesele şu ki, MagicWarrior, Warrior öğesini devralır ve MagicWarrior nesneleri, Fight(Warrior, Warrior) yöntemine geçirilebilir."

"Fakat List<MagicWarior>, List<Warrior> öğesini devralmaz . Yani onu oradan geçiremezsiniz!"

"Miras almaması ne demek?"

"Şunu demek istiyorum: biri Liste, diğeri Liste, ancak tür parametreleri var."

"Haklısın. Bir şekilde bunu hemen fark etmedim. Peki, bu sorunun zaten bir çözümü var mı?"

"Evet. Daha karmaşık bir yapı kullanmalısın. Şu şekilde görünüyor:"

örnek 1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }

 public static boolean fight(List<? extends Warrior> w1, List<? extends Warrior> w2)
 {
  return}
}

"? Genişletilmiş Savaşçı" kısmı, "Savaşçıyı miras alan herhangi bir tür" anlamına gelir.

"Başka bir deyişle, artık bir List<MagicWarrior> ve bir List<ArcherWarrior> iletebilirsiniz ve her şey işe yarayacak."

"Bu harika. Ne kadar az sorun olursa o kadar iyi."

"Ben de böyle hissediyorum."

"Ama ya Warrior'ı devralan bir şeye ihtiyacım yoksa? Yönteme herhangi bir tür parametresi olan herhangi bir Listeyi iletmek istiyorsam ne olacak? Buna izin veriliyor mu?"

"Evet, bunu yapmak için iki notasyon biçimi vardır:"

List<? extends Object>
List<?>

"İkisi de aynı anlama geliyor, bu yüzden genellikle ikinci versiyon kullanılıyor."

"Hepsi bugün için."

"Teşekkürler Ellie. Bugün gerçekten çok şey öğrendim."