我有这样的代码
short a = 1;
short b = 2 ;
short c = a + b; // dosen't compile
编译失败的原因是什么? x
+ x
始终生成Integer
或更大 Number
,但为什么?
答案 0 :(得分:20)
所有二元运算符都不会产生Integer
。但是,它将使用int
而不是更短的类型byte
,short
和char
如果编译器可以内联值,则可以为您的值转换值。 e.g。
final short a = 1;
final short b = 2;
short c = a + b; // does compile, because of constant inlining.
产生Integer
的唯一操作符是强制转换。
Integer i = (Integer) 1;
BTW:奇怪的是,Java将32位float
定义为比64位long
值“更宽”。这有一个缺点,浮动精度要低得多。考虑一下。
long l = 7777777777777777777L;
l += 0.0f;
System.out.println(l);
打印
7777777579364188160
即使0.0F被添加到l
,它也被隐式强制转换为float
(因为float更宽)然后被强制转换(使用运算符赋值)导致错误~20十亿。