„Hallo! Ich werde Ellies Lektion über Generika fortsetzen. Sind Sie bereit zuzuhören?“

"Ja."

„Dann fangen wir an.“

„Das Erste, was Sie wissen müssen, ist, dass die Methoden einer Klasse auch ihre eigenen Typparameter haben können.“

"Ich weiss."

„Nein, ich meine speziell ihre eigenen Typparameter:

Beispiel
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
}

„Diese Typparameter beziehen sich speziell auf die Methoden. Die Klasse hat keine Parameter. Sie könnten diese Methoden sogar als statisch deklarieren und sie ohne Objekt aufrufen.“

„Ich verstehe. Der Sinn der Typparameter in Methoden ist derselbe wie bei Klassen?“

„Ja. Aber es gibt etwas Neues.“

„Wie Sie bereits wissen, können Sie in der Typdeklaration einen Platzhalter verwenden. Stellen Sie sich dann folgende Situation vor:“

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

„Aber was ist, wenn wir der Sammlung ein neues Element hinzufügen möchten:“

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

„Das Problem besteht darin, dass der doSomething-Methode im Allgemeinen eine Liste übergeben werden kann, deren Elemente keine MyClass-Objekte sind, sondern Objekte einer beliebigen Unterklasse von MyClass. Aber Sie können einer solchen Liste keine MyClass-Objekte hinzufügen!“

„Ah. Also, was kann man dagegen tun?“

„Nichts. In dieser Situation kann man nichts tun. Aber das gab den Entwicklern von Java Anlass zum Nachdenken. Und sie haben sich ein neues Schlüsselwort ausgedacht: super .“

„Die Syntax sieht fast gleich aus:“

List<? super MyClass> list

Es gibt jedoch einen wichtigen Unterschied zwischen „Extends“ und „Super“.

„«? erweitert T» bedeutet, dass die Klasse ein Nachkomme von T sein muss.“

„„? super T“ bedeutet, dass die Klasse ein Vorfahre von T sein muss.“

„Holy Moly. Wo wird das also verwendet?“

„„? super T“ wird verwendet, wenn eine Methode das Hinzufügen zu einer Sammlung von T-Objekten beinhaltet. In diesem Fall könnte es sich um eine Sammlung von T-Objekten oder einen beliebigen Vorfahren von T handeln.“

„Ah. Das AT-Objekt kann einer Referenzvariablen zugewiesen werden, deren Typ einer der Vorfahren von T ist.“

„Ehrlich gesagt wird dieser Ansatz nicht sehr oft verwendet. Außerdem hat er einen Mangel. Zum Beispiel:“

Beispiele
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.
}

„Jetzt funktioniert das erste Beispiel nicht.“

„Da list sogar ein List<Object> sein könnte (Object ist die oberste Superklasse von MyClass), schreiben wir im Wesentlichen den folgenden ungültigen Code:“

Beispiel 1
List<Object> list; 

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

„Ich verstehe. Danke für die interessante Lektion.“

"Gern geschehen."