Video: Använda. A Great F*cking Bag 2024
Java är ett bra sätt att programmera, men ibland måste du bli kreativ. För att göra detta kan du använda parametrar för jokertecken. Antag att du har en metod som förklaras så här:
public void addItems (ArrayList-lista)
{
// metodkod som inte visas
}
Tankproblem: Komponerar följande uttalande?
addItems (new ArrayList ());
Svar: Nej.
Det är förvånande eftersom
String
är en undertyp av
Objekt
. Så du tror att en parameter som säger att den accepterar en
ArrayList
av objekt accepterar en
ArrayList
av strängar.
Arbetet fungerar tyvärr inte på det sättet när det gäller formella parametrar. I stället måste du använda en annan funktion i generics, kallad jokertecken.
Kort sagt, om du vill skapa en metod som accepterar någon typ av
ArrayList
måste du koda metoden så här:
public void addItems (ArrayList list)
I det här fallet indikerar frågetecknet att du kan koda någon typ av typ här.
Det är nästan lika bra som arv, men vad händer om du verkligen vill begränsa parametern till samlingar av en viss superklass? Anta att du arbetar med ett lönesystem som har en
Medarbetare
superklass med två underklasser med namnet
HourlyEmployee
och
SalariedEmployee
och du vill att den här metoden ska accepteras en
ArrayList
av
Medarbetare
objekt,
HourlyEmployee
objekt eller
SalariedEmployee
objekt?
I så fall kan du lägga till en
sträcker
-klausulen till wildcard, så här:
public void addItems (ArrayList list)
Då kan du ringa
addItems
metod med en
ArrayList
av typen
Medarbetare
,
HourlyEmployee
eller
SalariedEmployee
.
Nu, innan du kallar det en dag, ta det här exemplet ett steg längre: Antag att metoden
addItems
visas i en generisk klass som använder en formell typparameter
för att ange vilken typ av element som klassen accepterar, och du vill att metoden
addItems
ska acceptera en
ArrayList
av typen
E
eller någon av dess underklasser. För att göra det skulle du förklara metoden
addItems
så här:
public void addItems (ArrayList-lista)
Här betyder jokerteckningstypparametern
helt enkelt att
ArrayList < kan vara av typ
E
vor någon typ som sträcker sig
E
.