"Nu til et nyt, interessant emne: jokertegn."
"I bund og grund er dette noget som et «*»-mønster, der matcher hvad som helst."
"Men lad os starte fra begyndelsen."
"Forestil dig, at du har en Warrior-klasse og en metode, der bestemmer, hvilken af to krigere der er stærkest. Sådan kan det se ud:"
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 og ArcherWarrior arver begge Warrior. ."
"Det er lidt forenklet, men for et eksempel vil det gøre det."
"OKAY."
"Antag nu, at du har besluttet at lave en lignende metode til situationen, hvor flere krigere har sluttet sig til kampen."
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!
"Men her støder du på en kompileringsfejl og undrer dig over, hvad der kan være galt."
"Sagen er, at MagicWarrior arver Warrior , og MagicWarrior-objekter kan videregives til fight(Warrior, Warrior)-metoden."
"Men List<MagicWarior> arver ikke List<Warrior> . Så du kan ikke videregive den der!"
"Hvad mener du med, at det ikke arver det?"
"Jeg mener dette: den ene er en liste og den anden er en liste, men de har typeparametre."
"Du har ret. Jeg lagde på en eller anden måde ikke mærke til det med det samme. Så er der allerede en løsning på dette problem?"
"Jep. Du skal bruge en mere kompleks struktur. Sådan ser det ud:"
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 …
}
}
"? Udvider Warrior"-delen betyder "enhver type, der arver Warrior""
"Med andre ord, nu kan du sende en Liste<MagicWarrior> og en Liste<ArcherWarrior>, og alt vil fungere."
"Det er så fantastisk. Jo færre sådanne problemer, jo bedre."
"Sådan har jeg det også."
"Men hvad nu, hvis jeg ikke har brug for noget, der arver Warrior? Hvad nu, hvis jeg vil være i stand til at videregive en liste med en hvilken som helst typeparameter til metoden? Er det tilladt?"
"Ja, der er to former for notation til at gøre det:"
List<? extends Object>
List<?>
"De betyder begge det samme, så den anden version bruges normalt."
"Det var alt for i dag."
"Tak, Ellie. Jeg har virkelig lært meget i dag."
GO TO FULL VERSION