【发布时间】:2017-08-18 23:17:17
【问题描述】:
从下面的代码开始...
byte foo = 1;
byte fooFoo = foo + foo;
当我尝试编译此代码时,我会收到以下错误...
错误:(5, 27) java: 不兼容的类型: 从 int 到 byte 的可能有损转换
...但是如果foo 是最终...
final byte foo = 1;
final byte fooFoo = foo + foo;
文件将编译成功。
继续下面的代码...
final byte[] fooArray = new byte[1];
fooArray[0] = 1;
final byte foo = fooArray[0];
fooArray[0] = 127;
System.out.println("foo is: " + foo);
... 将打印
foo is: 1
... 这很好。该值被复制到最终变量中,并且不能再更改。使用数组中的值不会改变 foo 的值(正如预期的那样......)。
为什么以下需要强制转换?
final byte[] fooArray = new byte[1];
fooArray[0] = 1;
final byte foo = fooArray[0];
final byte fooFoo = foo + foo;
这与该问题中的第二个示例有何不同?为什么编译器会出现以下错误?
错误:(5, 27) java: 不兼容的类型: 从 int 到 byte 的可能有损转换
怎么会这样?
【问题讨论】:
-
只是关于第二个示例的注释,您在其中从数组初始化
foo并测试它不会改变。即使foo不是final,它的值也不会改变。赋值(在这种情况下是初始化)在它发生的那一刻复制值(1),就是这样。fooArray[0]到 127 的后续更改将不会自动传播到foo,无论它是否是最终的。
标签: java arrays casting int byte