Mar*_*szS 4 java jvm compiler-errors language-specifications
我有这样的代码
short a = 1;
short b = 2 ;
short c = a + b; // dosen't compile
Run Code Online (Sandbox Code Playgroud)
编译失败的原因是什么?x+ x总是产生Integer或更大 Number,但为什么?
Pet*_*rey 20
没有二元运算符会产生Integer.但是,它会使用int,而不是更短的类型byte,short而char 如果编译器可以内联的价值它可以为你投的价值.例如
final short a = 1;
final short b = 2;
short c = a + b; // does compile, because of constant inlining.
Run Code Online (Sandbox Code Playgroud)
产生一个的唯一操作员Integer是演员.
Integer i = (Integer) 1;
Run Code Online (Sandbox Code Playgroud)
BTW:奇怪的是,Java将32位定义float为比64位long值"更宽" .这有一个缺点,浮动精度要低得多.考虑一下.
long l = 7777777777777777777L;
l += 0.0f;
System.out.println(l);
Run Code Online (Sandbox Code Playgroud)
版画
7777777579364188160
Run Code Online (Sandbox Code Playgroud)
即使0.0F被添加到l它,它被隐式地转换为float(因为float更宽)然后回转(使用运算符赋值)导致大约200亿的错误.