"Sekarang untuk topik baharu yang menarik: kad bebas."

"Pada asasnya, ini adalah sesuatu seperti corak «*» yang sepadan dengan apa sahaja."

"Tetapi mari kita mulakan dari awal."

"Bayangkan anda mempunyai kelas Pahlawan dan kaedah yang menentukan mana antara dua pahlawan yang lebih kuat. Begini rupanya:"

Contoh 1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }
}
Contoh panggilan kaedah
MagicWarrior mag = new MagicWarrior();
ArcherWarrior archer = new ArcherWarrior();

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

"MagicWarrior dan ArcherWarrior kedua-duanya mewarisi Warrior. ."

"Ia agak mudah, tetapi sebagai contoh, ia akan berjaya."

"OKEY."

"Sekarang andaikan anda telah memutuskan untuk membuat kaedah yang sama untuk situasi di mana beberapa pahlawan telah menyertai pertempuran."

Contoh 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 
 }
}
Contoh panggilan kaedah
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!

"Tetapi di sini anda menghadapi ralat kompilasi dan hairan tentang apa yang boleh salah."

"Perkaranya ialah MagicWarrior mewarisi Warrior , dan objek MagicWarrior boleh dihantar ke kaedah fight(Warrior, Warrior)."

"Tetapi List<MagicWarior> tidak mewarisi List<Warrior> . Jadi, anda tidak boleh melepasinya di sana!"

"Apa maksud anda ia tidak mewarisinya?"

"Maksud saya ini: satu ialah Senarai dan satu lagi ialah Senarai, tetapi mereka mempunyai parameter jenis."

"Betul kata awak. Entah kenapa saya tak perasan langsung. Jadi, adakah sudah ada penyelesaian untuk masalah ini?"

"Ya. Anda perlu menggunakan struktur yang lebih kompleks. Beginilah rupanya:"

Contoh 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 …
 }
}

"Bahagian «? extends Warrior» bermaksud «sebarang jenis yang mewarisi Warrior»"

"Dengan kata lain, kini anda boleh lulus Senarai<MagicWarrior> dan Senarai<ArcherWarrior>, dan semuanya akan berfungsi."

"Itu sangat hebat. Semakin sedikit masalah seperti itu, semakin baik."

"Itu juga perasaan saya."

"Tetapi bagaimana jika saya tidak memerlukan sesuatu yang mewarisi Warrior? Bagaimana jika saya mahu boleh lulus mana-mana Senarai dengan mana-mana jenis parameter kepada kaedah? Adakah itu dibenarkan?"

"Ya, terdapat dua bentuk tatatanda untuk melakukan itu:"

List<? extends Object>
List<?>

"Kedua-duanya bermaksud perkara yang sama, jadi versi kedua biasanya digunakan."

"Itu sahaja untuk hari ini."

"Terima kasih, Ellie. Banyak yang saya belajar hari ini."