2014-09-29 40 views
2

请帮我把我的头围绕为什么这不起作用。 (这不是一个实际的问题,这是对OCPJP考试心理锻炼; Tibial。)Java:自动拆箱与铸造相结合

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

您正在使用抢先式数据类型,这是不允许的 – 2014-09-29 15:11:30

+1

@MuhammadRamahy该如何工作? 'Integer'和'Short'之间没有继承关系。 'short sPrimitive =(Short)iBoxed;'甚至不会编译,而'short sPrimitive =(Short)(Object)iBoxed;'编译时,编译器的类型检查被绕过是没有用的。运行时异常将被抛出。 – 5gon12eder 2014-09-30 00:22:27

+0

你是对的。我不知道我为什么这么说。 – 2014-10-01 11:19:37

回答

2

Integer有一个方法shortValue()。改为使用此:

short sPrimitive = iBoxed.shortValue(); 
2

自动装箱/拆箱表达式不能与更宽或更窄范围的投射结合使用。

但是,您可以双投的iBoxed变量:

short sPrimitive = (short) (int) iBoxed; 

首先iBoxed变量是自动拆箱到int,然后int转换为short