2013-06-27 21 views
8

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?

+0

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

+0

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

Antwort

4

List<?> bedeutet Liste von Objekten unbekannter Art, es ist nicht dasselbe wie List<Object>.

Weil wir die Art der Elemente in der Liste Ergebnis i.get(0) nicht wissen, wird von Java als Object betrachtet, und Sie können Object-List<?> nicht hinzufügen. Für den Fall, dass Ihr Java schlauer sein könnte, aber in komplexeren Code mit Wildcards, ist es einfach, es nicht typsicher zu machen.

+0

Soweit ich mich erinnere, ist dieser Fall mit Details in "Effective Java" von Joshua Bloch erklärt –

+0

** Liste ** entspricht ** Liste ** – Raf