2017-08-10 2 views
1

Gegeben: Confusion over Java generic method type inferenceWas die Art der T ist

Aber ich bin immer noch verwirrt, sagt dasblinkenlight, dass so lange Sie als Objekt in Einklang passieren dann:

public static <T> void copy(List<? super T> dest, List<? extends T> src) 

ich diese Seite gesehen haben Der Code sollte kompilieren.

Bedeutet dies, dass der erste Argumenttyp hilft festzustellen, was für die Sekunde gültig ist ?

so ziemlich alles, was ich habe um diese beiden Listen kompiliert, solange die erste in der Vererbungshierarchie höher ist.

Kann jemand helfen, ein wenig weiter

+0

ist dieser Beitrag ein wenig erläutern? https://stackoverflow.com/questions/1368166/what-is-a-difference-between-super-e-and-extends-e – csunday95

+0

Got it. Ich denke also, es ist richtig zu sagen, dass es in Situationen wie diesem wirklich kein T gibt und was wirklich wichtig ist, was im Methodenkörper geschieht und wie die Typen zueinander stehen. – madmax

Antwort

0

Die Methode Unterschrift erklären verwendet zwei verschiedene Platzhalter:

  • <? super T>
  • <? extends T>

Unterschiede hier erklärt: Difference between <? super T> and <? extends T> in Java

Bei jedem Aufruf dieser Methode versucht der Java-Compiler, ein T zu finden, so dass beide Argumente ihre Bedingung erfüllen. Es scheint, wenn der Multiple mehrere Möglichkeiten hat, wählt der Compiler das spezifischste T aus.

So

// fails because there is no superclass of Dog that is a subclass of Animal 
copy(new ArrayList<Dog>(), new ArrayList<Animal>()) 
// chooses T = Marly because it is most specific solution 
copy(new ArrayList<Animal>(), new ArrayList<Marly>()) 
Verwandte Themen