请帮助我解决为什么这不起作用。 (这不是一个实际问题,它是OCPJP考试的精神练习。)
public class ImplicitConversions {
Integer iBoxed;
short sPrimitive = (short)iBoxed;
}
//编译错误:不兼容的类型;要求:简短,发现:整数
我假设编译器尝试在没有(或之前)拆箱的情况下首先进行投射,而例如算术运算(iBoxed + iBoxed)将首先取消装箱。因此,可以肯定地说,自动装箱/拆箱在操作顺序(一元,算术,关系,逻辑,条件,分配)中具有其位置,它究竟在哪里?
我一直在阅读下面的源代码转换(为了确保我与1.6兼容),但是这个让我望而却步。谢谢。 http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html#20232
答案 0 :(得分:6)
这个
(short)iBoxed
是一个独立的表达式,不依赖于它的上下文。您要做的是将Integer
引用值转换为short
原始值。 That's just not a casting context that is allowed.(参见本章后面的表格。)
答案 1 :(得分:2)
Integer
有一个方法shortValue()
。请改用:
short sPrimitive = iBoxed.shortValue();
答案 2 :(得分:2)
自动装箱/拆箱表达式不能与更广泛或更窄范围的演员组合。
但是,您可以重复播放iBoxed
变量:
short sPrimitive = (short) (int) iBoxed;
首先iBoxed
变量自动取消装箱到int
,然后int
转换为short
。