2016-02-24 18 views
22

Napotkano problem podczas korzystania z TreeMap.Dlaczego trzeba konwertować z Integer na int

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 
    } 

Powyższy kod dał mi błąd kompilacji. Jednak po zmianie wiersza 8 na to:

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 
    } 

Następnie działa. Czy ktoś mógłby mi dać jakieś pomysły, dlaczego nie potrzebuję żadnych zmian w linii 6, ale muszę przekonwertować Integer na int w linii 8?

Odpowiedz

43

Zignorowano ostrzeżenie "surowy typ" w instrukcji for. Powinno być:

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

typu raw spowodowałoby getValue() wrócić Object. Jeśli podasz parametry typu, kompilator wie, że zwróci Integer, a to zostanie automatycznie rozpakowane.

+0

Och !!! Dziękuję bardzo! – youngyjd

+1

Czy chcesz zdefiniować tam typ, czy też wystarczy operator diamentu (Map.Entry <>) (który został wprowadzony w Javie 7), ponieważ a.entrySet() już definiuje typ? Używanie czegokolwiek innego, jak w OP oczywiście powoduje błąd. – Thomas

+2

@ Thomas - Musisz zdefiniować typ. Samo użycie operatora diamentowego da błąd podczas kompilacji. –

5

Istnieje więcej niż jedna operacja pod numerem (int) b.getValue(). Najpierw getValue() zwraca Object, a następnie jest przesyłany do Integer, który jest następnie rozpakowywany do int. a.get() w swojej własnej natychmiast zwraca Integer, ponieważ zadeklarowałeś z Integer w <> (zobacz https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#get(java.lang.Object) zwraca typ V).

Nie wykonano kompilacji target - b.getValue(), ponieważ była to operacja int - Object, która nie została zdefiniowana dla operatora -. Dlatego musisz wykonać rzutowanie na (int).

Po wykonaniu nie będzie, nawet jeśli b odnosi się do obiektu o numerze Integer.

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

następujące prace

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

działa także

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. 

Choć jeśli przy starcie b nie odnosi się do int obsada zawiedzie. Nawet jeśli się skompilował w pierwszej kolejności.

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 
Powiązane problemy