为什么需要从Integer转换为int

yyy*_*ung 22 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
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我一个编译错误.但是,当我将第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
    }
Run Code Online (Sandbox Code Playgroud)

然后它工作.任何人都可以给我一些想法,为什么我不需要在第6行进行任何更改但需要在第8行将Integer转换为int?

Jim*_*son 42

您忽略了for语句中的"原始类型"警告.它应该是:

    for(Map.Entry<Integer,Integer> b : a.entrySet()) {
        ...
Run Code Online (Sandbox Code Playgroud)

原始类型将导致getValue()返回Object.如果您提供类型参数,则编译器知道它将返回Integer,并且这将自动取消装箱.

  • @Thomas当然可以使用`map.foreach((k,v) - > dostuff)`,它不需要类型. (3认同)
  • @Thomas - 您需要定义类型.只使用菱形运算符会给你一个编译时错误. (2认同)

dis*_*ame 5

下面有多个操作(int) b.getValue().首先getValue()返回Object,然后将Integer其转换为已取消装箱的内容int.因为你在<>中声明了一个Integer a.get(),所以它自己立即返回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 '-'"
Run Code Online (Sandbox Code Playgroud)

以下作品

Integer a = 1;
Object  b = a;
System.out.println(3 - a);
Run Code Online (Sandbox Code Playgroud)

也有效

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.
Run Code Online (Sandbox Code Playgroud)

虽然如果在运行时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
Run Code Online (Sandbox Code Playgroud)