"Sekarang untuk topik baru yang menarik: wildcard."
"Pada dasarnya, ini seperti pola «*» yang cocok dengan apa saja."
"Tapi mari kita mulai dari awal."
"Bayangkan Anda memiliki kelas Prajurit dan metode yang menentukan mana dari dua prajurit yang lebih kuat. Begini tampilannya:"
class WarriorManager
{
public static boolean fight(Warrior w1, Warrior w2)
{
return w1.power > w2.power;
}
}
MagicWarrior mag = new MagicWarrior();
ArcherWarrior archer = new ArcherWarrior();
boolean isMagicCooler = WarriorManager.fight(mag, archer);
"MagicWarrior dan ArcherWarrior sama-sama mewarisi Warrior. ."
"Ini sedikit sederhana, tetapi sebagai contoh, itu akan berhasil."
"OKE."
"Sekarang misalkan Anda telah memutuskan untuk membuat metode yang sama untuk situasi di mana banyak prajurit telah bergabung."
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 …
}
}
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!
"Tapi di sini Anda menemukan kesalahan kompilasi dan bingung apa yang salah."
"Masalahnya adalah MagicWarrior mewarisi Warrior , dan objek MagicWarrior dapat diteruskan ke metode pertarungan (Prajurit, Prajurit)."
"Tapi List<MagicWarior> tidak mewarisi List<Warrior> . Jadi, kamu tidak bisa meneruskannya ke sana!"
"Apa maksudmu itu tidak mewarisinya?"
"Maksud saya ini: satu adalah Daftar dan yang lainnya adalah Daftar, tetapi mereka memiliki parameter tipe."
"Kamu benar. Entah bagaimana aku tidak langsung menyadarinya. Jadi, apakah sudah ada solusi untuk masalah ini?"
"Ya. Anda perlu menggunakan struktur yang lebih kompleks. Begini tampilannya:"
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 …
}
}
"Bagian «? extends Warrior» berarti «semua tipe yang mewarisi Warrior»"
"Dengan kata lain, sekarang kamu bisa memberikan List<MagicWarrior> dan List<ArcherWarrior>, dan semuanya akan bekerja."
"Itu luar biasa. Semakin sedikit masalah seperti itu, semakin baik."
"Itu juga yang aku rasakan."
"Tetapi bagaimana jika saya tidak membutuhkan sesuatu yang mewarisi Warrior? Bagaimana jika saya ingin dapat meneruskan List apa pun dengan parameter tipe apa pun ke metode ini? Apakah itu diperbolehkan?"
"Ya, ada dua bentuk notasi untuk melakukan itu:"
List<? extends Object>
List<?>
"Keduanya memiliki arti yang sama, jadi versi kedua biasanya digunakan."
"Cukup untuk hari ini."
"Terima kasih, Ellie. Aku benar-benar belajar banyak hari ini."
GO TO FULL VERSION