2017-10-05 2 views
0
List<? super Number> myNumsContra = new ArrayList<Number>(); 
    myNumsContra.add(2.0F); 
    myNumsContra.add(2); 
    myNumsContra.add(2L); 

    System.out.println(myNumsContra.get(0)); //should throw error 

Nach der Kontra Regel erwartet für Generika die get (0) oben nennen sollte einen Compiler-Fehler werfen. Aber ich sehe das nicht. Gibt es etwas, das ich vermisst habe? Ich verwende Java-8Kontra in Java nicht funktioniert Generika als

+1

die javadocs für die Methode sehen Sie https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList verwenden. html # get (int) –

+2

Warum sollte 'get (0)' genau einen Fehler werfen? –

+0

War das Lesen dieses Artikels (https://dzone.com/articles/covariance-and-contravariance), der besagt, ob die List-Klasse eine Grenze wie z. Super T, dann wäre ich nicht in der Lage, get (0) aufzurufen, da der Compiler einen Fehler auslösen würde. – jtkSource

Antwort

4

Es gibt keine Kompilierungszeit Fehler, weil println kann keine Object nehmen (was ist sogar eine ? ist garantiert kompatibel mit).

Der Fehler Sie suchen, ist

Number x = myNumsContra.get(0); 
// does not compile, because we cannot know this is really a `Number`. 
+0

Danke, dass ich verpasste :) so bedeutet es wirklich, dass es nicht zu einem Typ zuordnen kann! – jtkSource

+0

Nicht ohne einen Guss, nein. – Thilo

+0

@jtkSource: "Es bedeutet also wirklich, dass es einem Typ nicht zugeordnet werden kann, außer" Objekt " – newacct