我在使用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?
答案 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