Зачем нужно преобразовать из Integer в int
У меня возникла проблема, когда я использую TreeMap.
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?
Ответы
Ответ 1
Вы игнорировали предупреждение "raw type" в инструкции for
. Это должно быть:
for(Map.Entry<Integer,Integer> b : a.entrySet()) {
...
Необработанный тип приведет к возврату getValue()
Object
. Если вы укажете параметры типа, то компилятор знает, что он вернет Integer
, и это автоматически распакуется.
Ответ 2
Существует несколько операций, расположенных под (int) b.getValue()
. Сначала getValue()
возвращает Object
, а затем он отправляется в Integer
, который затем распаковывается в int
. a.get()
в нем непосредственно возвращает Integer
, так как вы объявили с помощью 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.
Хотя если во время выполнения b не ссылается на 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