Unterschiede zwischen 'copy (Liste? super T Ziel, Liste? erweitert T src)' und 'Kopie (ListT Ziel, Liste? erweitert T src)'

8

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.

    
Xin 25.01.2016, 04:40
quelle

2 Antworten

5

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     

matt freake 25.01.2016 10:35
quelle
4

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

%Vor%     
Marco13 25.01.2016 12:16
quelle

Tags und Links