"ตอนนี้สำหรับหัวข้อใหม่ที่น่าสนใจ: สัญลักษณ์แทน"

"โดยพื้นฐานแล้ว นี่คือรูปแบบ «*» ที่ตรงกับอะไรก็ได้"

"แต่เรามาเริ่มจากจุดเริ่มต้นกันเถอะ"

"ลองนึกภาพว่าคุณมีคลาส Warrior และวิธีการที่กำหนดว่านักรบคนไหนในสองคนที่แข็งแกร่งกว่ากัน นี่คือลักษณะที่ปรากฏ:"

ตัวอย่างที่ 1
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 ทั้งคู่ "

"มันง่ายไปหน่อย แต่ตัวอย่างก็จะทำ"

"ตกลง."

"ตอนนี้ สมมติว่าคุณตัดสินใจที่จะสร้างวิธีการที่คล้ายกันสำหรับสถานการณ์ที่นักรบหลายคนเข้าร่วมการต่อสู้"

ตัวอย่างที่ 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 
 }
}
ตัวอย่างการเรียกใช้เมธอด
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>ดังนั้นคุณผ่านมันไปไม่ได้!"

“หมายความว่ายังไงที่ไม่ได้รับมรดก”

"ฉันหมายถึงสิ่งนี้: อันหนึ่งคือรายการและอีกอันคือรายการ แต่มีพารามิเตอร์ประเภท"

“คุณพูดถูก ฉันไม่ทันสังเกตเลย ดังนั้น มีวิธีแก้ไขปัญหานี้แล้วหรือยัง”

"ใช่แล้ว คุณต้องใช้โครงสร้างที่ซับซ้อนกว่านี้ หน้าตาจะเป็นแบบนี้:"

ตัวอย่างที่ 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}
}

"ส่วน «? ขยาย Warrior» หมายถึง «ประเภทใดๆ ที่สืบทอด Warrior»"

"อีกนัยหนึ่ง ตอนนี้คุณสามารถผ่านรายการ<MagicWarrior> และรายการ<ArcherWarrior> แล้วทุกอย่างก็จะสำเร็จ"

"มันยอดเยี่ยมมาก ยิ่งมีปัญหาดังกล่าวน้อยเท่าไหร่ก็ยิ่งดีเท่านั้น"

“ฉันก็รู้สึกแบบนั้นเหมือนกัน”

"แต่ถ้าฉันไม่ต้องการบางอย่างที่สืบทอด Warrior ล่ะ จะทำอย่างไรถ้าฉันต้องการส่ง List ใดๆ ที่มีพารามิเตอร์ประเภทใดก็ได้ไปยังเมธอด อนุญาตหรือไม่"

"ใช่ มีสัญกรณ์สองรูปแบบในการทำเช่นนั้น:"

List<? extends Object>
List<?>

"ทั้งคู่หมายถึงสิ่งเดียวกัน ดังนั้นจึงมักใช้เวอร์ชันที่สอง"

"นั่นคือทั้งหมดสำหรับวันนี้"

"ขอบคุณ เอลลี่ วันนี้ฉันได้เรียนรู้อะไรมากมายจริงๆ"