2016-02-24 4 views
22

Ich habe ein Problem gefunden, wenn ich TreeMap verwende.Warum muss ich von Integer in int konvertieren

Map<Integer, Integer> a = new TreeMap<Integer, Integer>(); 
    a.put(5,1); 
    a.put(3,2); 
    a.put(4,3); 
    int target = 7; 
    System.out.println(target - a.get(5)); //line 6 
    for(Map.Entry b : a.entrySet()){ 
     System.out.println(target - b.getValue()); //line 8 
    } 

Der obige Code gab mir einen Kompilierungsfehler. Allerdings, wenn ich die Zeile 8 zu diesem ändern:

Map<Integer, Integer> a = new TreeMap<Integer, Integer>(); 
    a.put(5,1); 
    a.put(3,2); 
    a.put(4,3); 
    int target = 7; 
    System.out.println(target - a.get(5)); //line 6 
    for(Map.Entry b : a.entrySet()){ 
     System.out.println(target - (int) b.getValue()); //line 8 
    } 

Dann funktioniert es. Könnte mir jemand ein paar Ideen geben, warum ich in Zeile 6 keine Änderung brauche, aber in Zeile 8 eine ganze Zahl in int umwandeln muss?

Antwort

43

Sie haben die Warnung "Rohtyp" in der for-Anweisung ignoriert. Es sollte sein:

for(Map.Entry<Integer,Integer> b : a.entrySet()) { 
     ... 

Die rohe Art getValue() verursachen würde Object zurückzukehren. Wenn Sie die Typparameter angeben, weiß der Compiler, dass er Integer zurückgibt, und das wird automatisch deaktiviert.

+0

Oh !!! Vielen Dank! – youngyjd

+1

Müssen Sie den Typ dort definieren oder wäre der Diamantoperator (Map.Entry <>) genug (was mit Java 7 eingeführt wurde), da a.entrySet() den Typ bereits definiert? Nichts wie im OP zu benutzen, verursacht natürlich den Fehler. – Thomas

+2

@Thomas - Sie müssen den Typ definieren. Wenn Sie nur den Diamant-Operator verwenden, erhalten Sie einen Kompilierungsfehler. –

5

Es befinden sich mehr als eine Operation unter (int) b.getValue(). Zuerst getValue() gibt Object zurück und dann wird das zu Integer gegossen, das dann zu int entpackt wird. a.get() in seinem eigenen sofort Integer zurück, da Sie a mit Integer in <> deklariert haben (siehe https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#get(java.lang.Object) gibt es den V-Typ zurück).

Die target - b.getValue() wurde nicht kompiliert, weil es int - Object Operation war, die nicht für Operator - definiert ist. Deshalb musst du nach (int) casten.

Folgendes funktioniert nicht, obwohl b sich auf das Objekt bezieht, das Integer ist.

Integer a = 1; 
Object b = a; 
System.out.println(3 - b); // compile time error "bad operand types for binary operator '-'" 

Nach Werke

Integer a = 1; 
Object b = a; 
System.out.println(3 - a); 

arbeitet auch

Integer a = 1; 
Object b = a; 
System.out.println(3 - (int) b); //this is when you say to compiler not to worry since you are sure that object reference refers to the object that is Integer. 

Obwohl, wenn zur Laufzeit b nicht die Besetzung fehl int bezieht. Auch wenn es in erster Linie kompiliert wurde.

Integer a = 1; 
String s = "shouldn't work at runtime"; 
Object b = s; 
System.out.println(3 - (int) b); //this will compile but fail at runtime