? extends HasWord
bedeutet "Eine Klasse / Schnittstelle, die sich erweitert HasWord
." Mit anderen Worten, sich HasWord
selbst oder eines seiner Kinder ... im Grunde alles, was mit instanceof HasWord
Plus funktionieren würde null
.
In technischer Hinsicht ? extends HasWord
handelt es sich um einen begrenzten Platzhalter, der in Punkt 31 der 3. Ausgabe von Effective Java ab Seite 139 behandelt wird. Dasselbe Kapitel aus der 2. Ausgabe ist online als PDF verfügbar . Der Teil auf begrenzten Platzhaltern ist Punkt 28 ab Seite 134.
Update: Der PDF-Link wurde aktualisiert, da Oracle ihn vor einiger Zeit entfernt hat. Es verweist nun auf die Kopie, die von der School of Electronic Engineering and Computer Science der Queen Mary University in London gehostet wird.
Update 2: Gehen wir etwas genauer darauf ein, warum Sie Platzhalter verwenden möchten.
Wenn Sie eine Methode deklarieren, deren Signatur erwartet, dass Sie übergeben List<HasWord>
, können Sie nur a übergeben List<HasWord>
.
Wenn diese Signatur jedoch vorhanden List<? extends HasWord>
ist, können Sie List<ChildOfHasWord>
stattdessen eine übergeben.
Beachten Sie, dass es einen subtilen Unterschied zwischen List<? extends HasWord>
und gibt List<? super HasWord>
. Wie Joshua Bloch es ausdrückte: PECS = Produzent-erweitert, Konsumenten-Super.
Dies bedeutet, dass Sie verwenden sollten, wenn Sie eine Sammlung übergeben, aus der Ihre Methode Daten abruft (dh die Sammlung produziert Elemente für Ihre Methode) extends
. Wenn Sie eine Sammlung übergeben, zu der Ihre Methode Daten hinzufügt (dh die Sammlung verbraucht Elemente, die Ihre Methode erstellt), sollte sie verwendet werdensuper
.
Das mag verwirrend klingen. Allerdings können Sie es sehen List
‚s - sort
Befehl (die nur eine Verknüpfung zu den beiden argument Version von Collections.sort ist). Anstatt a zu nehmen Comparator<T>
, braucht es tatsächlich a Comparator<? super T>
. In diesem Fall verbraucht der Komparator die Elemente von List
, um die Liste selbst neu zu ordnen.