"Most egy új, érdekes téma: a helyettesítő karakterek."

"Lényegében ez valami "*" minta, ami bármihez passzol."

– De kezdjük elölről.

"Képzeld el, hogy van egy Warrior osztályod és egy módszered, amely meghatározza, hogy a két harcos közül melyik az erősebb. Így nézhet ki:

1. példa
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }
}
Példa metódushívás
MagicWarrior mag = new MagicWarrior();
ArcherWarrior archer = new ArcherWarrior();

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

"A MagicWarrior és az ArcherWarrior is örökli a Warriort. ."

– Kicsit leegyszerűsítő, de példaként megteszi.

"RENDBEN."

"Most tegyük fel, hogy úgy döntöttél, hogy hasonló módszert alkalmazol arra a helyzetre, amikor több harcos is csatlakozott a harchoz."

1. példa
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 
 }
}
Példa metódushívá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!

"De itt fordítási hibába ütközik, és tanácstalan vagy, hogy mi lehet a hiba."

"Az a helyzet, hogy a MagicWarrior megörökli a Warrior -t , és a MagicWarrior objektumok átadhatók a harc (Warrior, Warrior) metódusnak."

"De a List<MagicWarior> nem örökli a List<Warrior>-t . Szóval nem adhatod át ott!"

– Hogy érted, hogy nem örökli?

"Erre gondolok: az egyik egy Lista, a másik egy Lista, de típusparamétereik vannak."

"Igazad van. Ezt valahogy nem vettem azonnal észre. Szóval, van már megoldás erre a problémára?"

"Igen. Bonyolultabb szerkezetet kell használnod. Így néz ki:"

1. példa
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 …
 }
}

"A «? kiterjeszti a Warriort» rész jelentése «bármilyen típus, amely a Warriort örökli»

"Más szóval, most átadhatsz egy listát<Varázsharcos> és egy listát<ArcherWarrior>, és minden működni fog."

"Ez olyan fantasztikus. Minél kevesebb ilyen probléma, annál jobb."

– Én is így érzem.

"De mi van, ha nincs szükségem valamire, ami a Warriort örökli? Mi van, ha azt akarom, hogy bármilyen típusú listát átadjak a metódusnak? Ez megengedett?"

"Igen, kétféle jelölés létezik:"

List<? extends Object>
List<?>

– Mindkettő ugyanazt jelenti, ezért általában a második változatot használják.

"Ez minden mára."

– Köszönöm, Ellie. Valóban sokat tanultam ma.