Von this Oracle Java-Tutorial:Capturing Platzhalter in Java Generics
Das WildcardError Beispiel erzeugt ein Capture-Fehler beim Kompilieren:
public class WildcardError {
void foo(List<?> i) {
i.set(0, i.get(0));
}
}
Nach dieser Fehler Demonstration, sie das Problem beheben, indem Sie eine Hilfsmethode:
public class WildcardFixed {
void foo(List<?> i) {
fooHelper(i);
}
// Helper method created so that the wildcard can be captured
// through type inference.
private <T> void fooHelper(List<T> l) {
l.set(0, l.get(0));
}
}
Zuerst th ey sagt, dass die Listeneingabeparameter (i
) als Object
gesehen wird:
In diesem Beispiel verarbeitet der Compiler die
i
Eingabeparameter als vom Typ Object ist.
Warum gibt i.get(0)
keine Object
zurück? wenn es als solches bereits übergeben wurde?
Außerdem, was ist der Sinn der Verwendung einer <?>
, wenn Sie dann eine Hilfsmethode mit <T>
verwenden müssen. Wäre nicht besser, direkt T
zu verwenden, was abgeleitet werden kann?
Dies ist, was Eclipse mir gibt: 'Die Methode set (int, erfassen # 1-of?) In der Art List Gilt nicht für die Argumente (int, erfassen # 2-of ?) 'Klingt noch lächerlicher. –
Ich schrieb gerade eine [Antwort] (http://stackoverflow.com/questions/30797805/understanding-a-captured-type-in-java/30798066#30798066), die Wildcard-Capture für eine andere Frage erklärt. Diese Information scheint auch für diese Frage relevant zu sein. – Lii