"Hei! Jeg skal fortsette Ellies leksjon om generiske legemidler. Klar til å lytte?"

"Ja."

"Så la oss begynne."

"Det første du trenger å vite er at en klasses metoder også kan ha sine egne typeparametere."

"Jeg vet."

"Nei, jeg mener spesifikt deres egne typeparametere: "

Eksempel
class Calculator
{
  T add(T a, T b); // Add
  T sub(T a, T b); // Subtract
  T mul(T a, T b); // Multiply
  T div(T a, T b); // Divide
}

"Disse typeparametrene gjelder spesifikt metodene. Klassen har ikke parametere. Du kan til og med erklære disse metodene statiske og kalle dem uten et objekt."

"Jeg skjønner. Poenget med typeparametrene i metoder er det samme som for klasser?"

"Ja. Men det er noe nytt."

"Som du allerede vet, kan du bruke et jokertegn i typedeklarasjonen. Se for deg følgende situasjon:"

Eksempel 1
public void doSomething(List<? extends MyClass> list)
{
 for(MyClass object : list)
 {
  System.out.println(object.getState()); // Everything works well here.
 }
}

"Men hva om vi vil legge til en ny gjenstand til samlingen:"

Eksempel 2
public void doSomething(List<? extends MyClass> list)
{
 list.add(new MyClass()); // Error!
}

"Problemet er at i det generelle tilfellet kan doSomething-metoden sendes en liste hvis elementer ikke er MyClass-objekter, men objekter av en hvilken som helst underklasse av MyClass. Men du kan ikke legge til MyClass-objekter i en slik liste!"

"Ah. Så, hva kan gjøres med det?"

"Ingenting. I denne situasjonen kan du ikke gjøre noe. Men dette ga Javas skapere noe å tenke på. Og de kom opp med et nytt nøkkelord: super ."

"Syntaksen ser nesten lik ut:"

List<? super MyClass> list

Men det er et viktig skille mellom extends og super.

"«? utvider T» betyr at klassen må være en etterkommer av T."

"«? super T» betyr at klassen må være en stamfar til T."

"Holy moly. Så hvor brukes dette?"

"«? super T» brukes når en metode innebærer å legge til en samling av T-objekter. I dette tilfellet kan det være en samling av T-objekter eller en hvilken som helst stamfar til T."

"Ah. AT-objekt kan tilordnes en referansevariabel hvis type er en av Ts forfedre"

"Ærlig talt, denne tilnærmingen brukes ikke så ofte. Dessuten har den en mangel. For eksempel:"

Eksempler
public void doSomething(List<? super MyClass> list)
{
 for(MyClass object : list) // Error!
 {
  System.out.println(object.getState());
 }
}
public void doSomething(List<? super MyClass> list)
{
 list.add(new MyClass()); // Everything works well here.
}

"Nå fungerer ikke det første eksemplet."

"Siden listen til og med kan være en List<Object> (Objekt er MyClasss øverste superklasse), skriver vi i hovedsak følgende ugyldige kode:"

Eksempel 1
List<Object> list;

for(MyClass object : list) // Error!
{
 System.out.println(object.getState());
}

"Jeg skjønner. Takk for den interessante leksjonen."

"Værsågod."