"Hej! Jeg vil fortsætte Ellies lektion om generiske lægemidler. Klar til at lytte?"

"Ja."

"Så lad os begynde."

"Det første du skal vide er, at en klasses metoder også kan have deres egne typeparametre."

"Jeg ved."

"Nej, jeg mener specifikt deres egne typeparametre: "

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 typeparametre vedrører specifikt metoderne. Klassen har ikke parametre. Du kan endda erklære disse metoder statiske og kalde dem uden et objekt."

"Jeg kan se. Pointen med typeparametrene i metoder er det samme som for klasser?"

"Ja. Men der er noget nyt."

"Som du allerede ved, kan du bruge et jokertegn i typedeklarationen. Forestil dig så følgende situation:"

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

"Men hvad nu hvis vi vil tilføje et nyt element til samlingen:"

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

"Problemet er, at i det generelle tilfælde kan doSomething-metoden sendes til en liste, hvis elementer ikke er MyClass-objekter, men snarere objekter af enhver underklasse af MyClass. Men du kan ikke tilføje MyClass-objekter til en sådan liste!"

"Ah. Så hvad kan man gøre ved det?"

"Intet. I denne situation kan du ikke gøre noget. Men dette gav Javas skabere noget at tænke over. Og de fandt på et nyt nøgleord: super ."

"Syntaksen ser næsten den samme ud:"

List<? super MyClass> list

Men der er en vigtig skelnen mellem extends og super.

"«? udvider T» betyder, at klassen skal være en efterkommer af T."

"«? super T» betyder, at klassen skal være en forfader til T."

"Holy moly. Så hvor bruges det her?"

"«? super T» bruges, når en metode involverer tilføjelse til en samling af T-objekter. I dette tilfælde kan det være en samling af T-objekter eller en hvilken som helst forfader til T."

"Ah. AT-objekt kan tildeles en referencevariabel, hvis type er en hvilken som helst af T's forfædre"

"Ærligt talt bliver denne tilgang ikke brugt særlig tit. Desuden 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.
}

"Nu virker det første eksempel ikke."

"Da listen endda kunne være en List<Object> (Objekt er MyClass's øverste superklasse), skriver vi i det væsentlige følgende ugyldige kode:"

Eksempel 1
List<Object> list; 

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

"Jeg forstår det. Tak for den interessante lektion."

"Selv tak."