"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:
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);
"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."
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!
"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:"
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.
GO TO FULL VERSION