Подтвердить что ты не робот

Зачем нужно преобразовать из 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?

4b9b3361

Ответ 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