此Java代码
public class test{
public static void main(String[] args){
byte[] a = new byte[1];
a[0] = 1;
byte x = 1;
x = x + a[0];
System.out.println(x);
}
}
抛出以下编译错误:
test.java:10: possible loss of precision
found : int
required: byte
byte y = x + a[0];
^
1 error
是吗?这里发生了什么?所有变量都声明为byte。将1的显式转换为字节没有任何区别。但是,改为
public class test{
public static void main(String[] args){
byte[] a = new byte[1];
a[0] = 1;
byte x = 1;
x += a[0];
System.out.println(x);
}
}
一切都很好。我正在使用java版本1.6.0_16,build-b01进行编译。我的问题是:这是一个错误还是一个功能?为什么+ =的表现与+?
不同答案 0 :(得分:3)
你会发现this很有帮助的答案。
E1 op = E2形式的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,但E1仅被评估一次。
注意使用复合赋值运算符时引入的显式强制转换。
答案 1 :(得分:2)
在第一种情况下,结果是int。所以你需要为字节显式地强制转换它。但在第二种情况下,java会自动将值转换为byte。所以不需要铸造,也不例外。
答案 2 :(得分:2)
这是Java语言规范中的一个怪癖的结果。 The default type of an integral expression (such as x + a[0]
) is int
,当您尝试将结果分配给byte
而没有强制转换时,编译器会抱怨。从技术上讲,当然,它是正确的,你可以很容易地溢出byte
精度。 Using the +=
syntax avoids the separate x + a[0]
expression and its implicit widening conversion:
E1 op= E2
形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,但E1
仅被评估一旦。