2013-04-24 12 views
7

Ich las Java-Generika, stieß ich auf eine interessante Abfrage. Meine Frage ist wie folgt.Java Generics für obere und untere Grenze Wild Cards

  1. Für eine obere beschränkte Wildcard

    public static void printList(List<? extends Number> list) { 
        for (int i = 0; i < 10; i++) { 
         list.add(i);// gives compilation error 
        } 
    } 
    
  2. Für eine geringere beschränkte Wildcard

    public static void printList(List<? super Integer> list) { 
        for (int i = 0; i < 10; i++) { 
         list.add(i);// successfully compiles 
        } 
    } 
    

Ich bin mit diesem verwirrt, weil an der Sun Oracle-Dokumentation suchen Ich verstehe, dass Der Code sollte auch für Punkt 1 kompilieren

Upper Bound Wildcard Lower Bound Wildcard

Kann jemand bitte helfen Sie mir, dies zu verstehen?

+0

@baraky: danke für den Link habe ich es irgendwie vermisst .. aber immer noch die Frage ist warum kompiliert es nicht, wenn der generische Typ weiß, dass es eine Klasse mit Nummer erweitert werden muss. Sorry für überflüssige Frage. Es ist immer noch unklar für mich. – chaosguru

Antwort

7

Dies liegt daran, wenn Sie obere Schranke verwenden, können Sie keine Elemente zur Sammlung hinzufügen können, so dass sie nur lesen.

bedeutet dies, dass diese einige der rechtlichen Zuordnungen sind:

List<? extends Number> l = new ArrayList<Integer>(); 
List<? extends Number> l = new ArrayList<Double>(); 

so kann man nicht garantieren, dass, wenn das Objekt hinzufügen, wird es richtig Arten von Objekten halten. Zur besseren Erklärung bitte folgen: How can I add to List<? extends Number> data structures?

1

tatsächlich zum Glück das gleiche Szenario, habe ich die Antwort unter den nächsten Seiten von Sun Oracle Dokumentation. bitte finden Sie den Link unten. kann für jemanden nützlich sein, der in der Zukunft suchen würde.

Wildcard Capture