2016-02-24 5 views
22

У меня возникла проблема, когда я использую TreeMap.Зачем нужно преобразовать из Integer в 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 
    } 

Код выше дал мне ошибку компиляции. Однако, когда я меняю линию 8 на это:

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 
    } 

Тогда это работает. Может ли кто-нибудь дать мне некоторые идеи, почему мне не нужно никаких изменений в строке 6, но нужно преобразовать Integer в int в строке 8?

ответ

43

Вы игнорировали предупреждение «raw type» в инструкции for. Оно должно быть:

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

Необработанные типа может вызвать getValue() вернуть Object. Если вы предоставите параметры типа, компилятор знает, что он вернет Integer, и это автоматически распакуется.

+0

Oh !!! Огромное спасибо! – youngyjd

+1

Вам нужно определить тип там или был бы достаточно оператором алмаза (Map.Entry <>) (который был введен с Java 7), поскольку a.entrySet() уже определяет тип? Использование ничего, как в OP, конечно, вызывает ошибку. – Thomas

+2

@Thomas - Вам нужно определить тип. Просто использование оператора алмаза даст вам ошибку времени компиляции. –

5

Существует более одной операции, которая находится под (int) b.getValue(). Сначала getValue() возвращает Object, а затем литой до Integer, который затем распаковывается до int. a.get() в своем собственном немедленно возвращает Integer, так как вы объявили a с Integer в <> (см. https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#get(java.lang.Object) он возвращает тип V).

target - b.getValue() не скомпилирован, потому что это был int - Object операция, которая не определена для оператора -. Вот почему вам нужно сделать бросок до (int).

Следующая работа не работает, хотя b относится к объекту Integer.

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

следующие работы

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

Также работает

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. 

Хотя, если во время выполнения б не относится к Int литая потерпит неудачу. Даже если это скомпилировалось в первую очередь.

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 
Смежные вопросы