Ich versuche Java Generics Wildcard zu lernen, indem ich Folgendes lese: Ссылка
Es gibt ein Beispiel im Material:
%Vor%Ich habe mich gefragt, ob ich die Methodensignatur wie folgt ändern kann:
%Vor%↓
%Vor%Gibt es irgendwelche Unterschiede zwischen diesen beiden Methoden der Synthese?
Beispiele würden geschätzt.
Sie haben Recht. In diesem Fall werden die Typargumente der beiden Parameter verwendet, um die Beziehung auszudrücken, dass dest
Objekte eines Super-Typs der Objekte in src
enthalten muss. Wenn Sie also sagen, dass src
enthält <? extends T>
, dann ist es ausreichend zu sagen, dass dest
Objekte von T enthält.
Sie können es auch andersherum ausdrücken, nämlich:
%Vor%mit dem gleichen Effekt.
EDIT: Ich vermute, dass der Autor den Punkt über das PECS-Prinzip
Wie Matt Freake in seiner Antwort darauf hingewiesen hat , gibt es keinen praktischen Unterschied zwischen
%Vor% Das folgende Snippet enthält ein exampleShowingThatTheyAreBasicallyEquivalent
.
Der Grund, warum die Autoren sich entschieden haben, ? super T
zu verwenden, ist höchstwahrscheinlich, dass sie die PECS-Prinzip: Producer extends
- Consumer super
.
In diesem Beispiel ist die erste Liste ein Consumer von Objekten. Es empfängt nur Objekte aus der anderen Liste. Daher sollte sein Typ List<? super T>
sein.
Das folgende Snippet enthält jedoch auch exampleShowingOneSubtleDifference
. Ich kann mir kaum einen Fall vorstellen, in dem dies wirklich praktisch relevant ist, sondern nur um es aufzuzeigen: Wenn Sie die Typinferenz umgehen, Wenn Sie den Typ <T>
auf einen bestimmten Typ festlegen, können Sie immer noch List<? super T>
als erstes Argument für die erste Methode übergeben. In der zweiten muss der Typ genau übereinstimmen - aber das ist einfach, was die Methodensignatur sagt, also ist es offensichtlich ...