"ตอนนี้สำหรับหัวข้อใหม่ที่น่าสนใจ: สัญลักษณ์แทน"
"โดยพื้นฐานแล้ว นี่คือรูปแบบ «*» ที่ตรงกับอะไรก็ได้"
"แต่เรามาเริ่มจากจุดเริ่มต้นกันเถอะ"
"ลองนึกภาพว่าคุณมีคลาส Warrior และวิธีการที่กำหนดว่านักรบคนไหนในสองคนที่แข็งแกร่งกว่ากัน นี่คือลักษณะที่ปรากฏ:"
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 และArcherWarriorสืบทอดWarrior ทั้งคู่ "
"มันง่ายไปหน่อย แต่ตัวอย่างก็จะทำ"
"ตกลง."
"ตอนนี้ สมมติว่าคุณตัดสินใจที่จะสร้างวิธีการที่คล้ายกันสำหรับสถานการณ์ที่นักรบหลายคนเข้าร่วมการต่อสู้"
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!
"แต่ที่นี่คุณพบข้อผิดพลาดในการรวบรวมและสงสัยว่ามีอะไรผิดปกติ"
"สิ่งนี้คือMagicWarrior สืบทอด Warriorและวัตถุ MagicWarrior สามารถส่งผ่านไปยังวิธีการต่อสู้ (Warrior, Warrior)"
"แต่List<MagicWarior> ไม่สืบทอด List<Warrior>ดังนั้นคุณผ่านมันไปไม่ได้!"
“หมายความว่ายังไงที่ไม่ได้รับมรดก”
"ฉันหมายถึงสิ่งนี้: อันหนึ่งคือรายการและอีกอันคือรายการ แต่มีพารามิเตอร์ประเภท"
“คุณพูดถูก ฉันไม่ทันสังเกตเลย ดังนั้น มีวิธีแก้ไขปัญหานี้แล้วหรือยัง”
"ใช่แล้ว คุณต้องใช้โครงสร้างที่ซับซ้อนกว่านี้ หน้าตาจะเป็นแบบนี้:"
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 …
}
}
"ส่วน «? ขยาย Warrior» หมายถึง «ประเภทใดๆ ที่สืบทอด Warrior»"
"อีกนัยหนึ่ง ตอนนี้คุณสามารถผ่านรายการ<MagicWarrior> และรายการ<ArcherWarrior> แล้วทุกอย่างก็จะสำเร็จ"
"มันยอดเยี่ยมมาก ยิ่งมีปัญหาดังกล่าวน้อยเท่าไหร่ก็ยิ่งดีเท่านั้น"
“ฉันก็รู้สึกแบบนั้นเหมือนกัน”
"แต่ถ้าฉันไม่ต้องการบางอย่างที่สืบทอด Warrior ล่ะ จะทำอย่างไรถ้าฉันต้องการส่ง List ใดๆ ที่มีพารามิเตอร์ประเภทใดก็ได้ไปยังเมธอด อนุญาตหรือไม่"
"ใช่ มีสัญกรณ์สองรูปแบบในการทำเช่นนั้น:"
List<? extends Object>
List<?>
"ทั้งคู่หมายถึงสิ่งเดียวกัน ดังนั้นจึงมักใช้เวอร์ชันที่สอง"
"นั่นคือทั้งหมดสำหรับวันนี้"
"ขอบคุณ เอลลี่ วันนี้ฉันได้เรียนรู้อะไรมากมายจริงๆ"
GO TO FULL VERSION