Java:加宽和自动装箱转换问题
我不明白为什么java不进行加宽和自动装箱Java:加宽和自动装箱转换问题,java,type-conversion,Java,Type Conversion,我不明白为什么java不进行加宽和自动装箱 Integer i = (short) 10; 我认为会发生以下情况: 首先将转换范围从10缩小到short short然后会扩展到int int将自动装箱到Integer 相反,这是一个编译错误 例2: 短x=10 整数y=x 这也失败了。这里发生的是从int到short的强制转换,然后尝试从short到Integer的赋值转换 赋值转换()允许先装箱再加宽,但不允许先加宽再装箱 分配上下文允许使用以下内容之一: 身份转换(§5.1.1) 扩大原
Integer i = (short) 10;
我认为会发生以下情况:
10
缩小到short
short
然后会扩展到int
int
将自动装箱到Integer
整数y=x
这也失败了。这里发生的是从
int
到short
的强制转换,然后尝试从short
到Integer
的赋值转换
赋值转换()允许先装箱再加宽,但不允许先加宽再装箱
分配上下文允许使用以下内容之一:
- 身份转换(§5.1.1)
- 扩大原语转换(§5.1.2)
- 拓宽参考转换(§5.1.5)
- 装箱转换(§5.1.7)后可选加宽 参考转换
- 拆箱转换(§5.1.8)后可选加宽 原语转换
Integer i = (int) (short) 10;
分配上下文允许使用以下内容之一:
- 身份转换(§5.1.1)
- 扩大原语转换(§5.1.2)
- 拓宽参考转换(§5.1.5)
- 装箱转换(§5.1.7)后可选加宽 参考转换
- 拆箱转换(§5.1.8)后可选加宽 原语转换
short
转换回int
(转换转换),这将允许分配转换为装箱转换:
Integer i = (int) (short) 10;
(或者在这里,首先不要将其转换为short
)
在java中,它遵循“自动装箱,然后加宽”的顺序,不管您是否这样做 这: int x=5; 对象obj=x 或 这: int x=5; 长l=x 仅当存在is-a关系时才会加宽。
所以,当应用上述序列时,第一种情况对编译器非常有效,因为int将是autobox到Integer,然后分配给Object,即加宽(即autobox先加宽,然后加宽),处于is-A关系中。但在第二种情况下,如果int x是autbox to Integer,则不允许将其赋值为Long,因为它不是一种关系,因此会引发编译错误。可以在自动装箱和加宽方面使用重载来模拟类似的用例
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);
}
输出:加宽
因此,在nut shell中,我们可以说,加宽在基于JLS 5.1.5的java中占主导地位,为什么我的示例2失败了?在处理诸如
Short
和Integer
等包装器对象时,重要的是要认识到Short
不是Integer
;一个不是另一个的子类。您在此处引用的转换(加宽引用转换)在此处不适用。哦,是的。我现在想起来了。扩展引用转换涉及子类——换句话说,是相关的类。为什么不先把int改为short,再改为int,然后只改为Integer?不够聪明OP@yapkm01并不是JVM不够智能,而是它根本不被允许short
toint
是一种扩展的原语转换,int
toInteger
是一种装箱转换。赋值转换只能执行这两个操作中的一个,不能同时执行这两个操作。