short t=(short)1 * 3 ;
int tadpole = (int)5 * 2L ;
第一条语句运行良好,但第二条语句引发编译错误。根据规则,在执行算术运算时,默认情况下,if any byte/short/char将转换为int。那么第一个表达式是如何工作的呢?
此外,我检查了
short x = (int) 30;
int y = (long) 30;
语句3有效,但语句4无效。
为什么我可以将int
分配给short
,而不能将long
分配给int
?
答案见第5.2节JLS的分配转换:
此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28(:- 如果变量的类型是byte、short或char,并且常量表达式的值可以用变量的类型表示,则可以使用窄基元转换
您的示例1和3属于此子句:这些是常量表达式(值为3或30(,表达式的类型为int
,值适合short
。
对于具有long
值的常量表达式,没有类似的子句。
示例2和4生成long
值(在示例2中,因为其中一个操作数是long
,在示例4中,因为转换为long
(。
请注意,您的示例1和2可能并没有像您想象的那样被解释。铸造比乘法有更高的优先级,因此对示例的评估就像它们被写为:
short t = ((short)1) * 3 ;
int tadpole = ((int)5) * 2L ;
为什么存在此规则
其中一个原因是Integer Literals的定义:任何时候源代码包含一个整数(没有后缀l
或L
,这将使其成为long
(,该文本的类型都是int
。
来自";"分配转换";意味着您可以编写
byte[] data = { 1, 2, 3, 4 };
如果没有这个规则,你就必须编写
byte[] data = { (byte) 1, (byte) 2, (byte) 3, (byte) 4 };
CCD_ 15常数不需要类似的规则。