1

这个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

嗯?这里发生了什么?所有变量都声明为字节。将 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 进行编译。我的问题是:这是错误还是功能?为什么 += 的表现与 + 不同?

4

3 回答 3

3

你会发现这个答案很有帮助。

E1 op= E2 形式的复合赋值表达式等价于 E1 = (T)((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。

请注意使用复合赋值运算符时引入的显式强制转换。

于 2013-09-25T14:24:20.497 回答
2

在第一种情况下,结果是 int。所以你需要明确地将它转换为字节。但在第二种情况下,java 会自动将值转换为字节。所以不需要铸造,也不例外。

于 2013-09-25T14:21:37.003 回答
2

这是 Java 语言规范中一个怪癖的结果。整型表达式(例如x + a[0])的默认类型是int,然后当您尝试将结果分配给byte没有强制转换的 a 时,编译器会报错。从技术上讲,当然,它是正确的,而且你很容易溢出byte精度。使用+=语法避免了单独的x + a[0]表达式及其隐式扩展转换:

形式的复合赋值表达式E1 op= E2等价于E1 = (T) ((E1) op (E2)),其中T是 的类型E1,除了E1只计算一次。

于 2013-09-25T14:24:19.277 回答