我不明白为什么java不进行扩展然后自动装箱。
Integer i = (short) 10;
我认为会发生以下情况:
10
缩小为short
。short
将扩展为int
。int
然后会自动停靠到Integer
。相反,这是编译错误。
示例2:
短x = 10;
整数y = x;
这也失败了。
答案 0 :(得分:3)
这里发生的是从int
到short
的转换转换,然后尝试从short
转换为Integer
。
分配转换(§5.2)允许拳击然后加宽,但不能加宽然后拳击。
分配上下文允许使用以下之一:
身份转换(第5.1.1节)
扩大原始转换(第5.1.2节)
扩大参考转换(第5.1.5节)
拳击转换(§5.1.7),可选地后跟加宽 参考转换
取消装箱转换(第5.1.8节),可选地后跟加宽 原始转换。
答案 1 :(得分:3)
根据JLS, Section 5.2处理作业转换:
分配上下文允许使用以下之一:
身份转换(第5.1.1节)
扩大原始转换(第5.1.2节)
扩大参考转换(第5.1.5节)
拳击转换(§5.1.7),可选地后跟加宽 参考转换
取消装箱转换(第5.1.8节),可选地后跟加宽 原始转换。
无法一次应用两次转换(扩大原始转换和装箱转换);这里只能应用一次转换,因此必须导致错误。
解决方案是将short
强制转换为int
(转换转换),这样可以将赋值转换为装箱转换:
Integer i = (int) (short) 10;
(或者在这里,首先不要把它投到short
。)
Integer i = 10;
答案 2 :(得分:0)
在java中,无论你是否正在做,它都会将序列作为“autoBoxing然后加宽” 这个 : int x = 5; 对象obj = x;
或者 这样:
int x = 5; 长l = x;
只有在存在is-a关系时才会发生扩展 因此,在应用上述序列时,第一种情况对于编译器非常有效,因为int将是autobox到Integer然后分配给Object,即加宽(即首先是autobox然后加宽),处于Is-A关系。但在第二种情况下,如果int x是autbox到Integer并且赋值为Long则不允许,不是is-a关系,因此会引发编译错误。
答案 3 :(得分:0)
可以在自动装箱和加宽方面使用重载来模拟类似的用例。
public static void m(short s) {
System.out.println("widening");
}
public static void m(Integer i) {
System.out.println("Autoboxing");
}
public static void main(String[] args) {
short x = 10;
m(x);
}
输出:扩展
因此,在坚果壳中,我们可以说,在Java中,自动安装占主导地位