为什么需要从Integer转换为int

时间:2016-02-24 07:37:58

标签: java

我在使用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行进行任何更改但需要在第8行将Integer转换为int?

2 个答案:

答案 0 :(得分:42)

你忽略了&#34;原始类型&#34; UILabel声明中的警告。它应该是:

for

原始类型会导致 for(Map.Entry<Integer,Integer> b : a.entrySet()) { ... 返回getValue()。如果你提供类型参数,那么编译器知道它会返回Object,这将自动取消装箱。

答案 1 :(得分:5)

(int) b.getValue()下面有多个操作。首先getValue()返回Object,然后将其转换为Integer,然后将其取消装箱到int。其中a.get()自己立即返回Integer,因为您在&lt;&gt;中声明了一个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