我试图找出为什么有些铸件有效而其他铸件不起作用。您能向我解释一下为什么其中一些示例有效而其他示例无效吗?
设置:
我正在使用jshell。
byte one = 1;
one ==> 1
示例1:
jshell> byte val = 200 - 200;
val ==> 0
据我所知,这些文字的类型为 int,但代码可以编译,因为结果适合字节。
示例2
jshell> byte val = 1 - one;
| Error:
| incompatible types: possible lossy conversion from int to byte
| byte val = 1 - one;
| ^-----^
当我将一个文字切换为变量时,代码突然无法编译。转换 espression 的任何或所有组件并不能解决问题。
示例3
jshell> byte val = (byte)(1) - one;
| Error:
| incompatible types: possible lossy conversion from int to byte
| byte val = (byte)(1) - one;
|
我希望这能起作用。毕竟我确实将这个表达式中的整数转换为字节,所以不应该出现“不兼容类型”错误。
示例4
jshell> byte val = 1 - (byte)(one);
| Error:
| incompatible types: possible lossy conversion from int to byte
| byte val = 1 - (byte)(one);
| ^-------------^
这更多的是一个实验,看看这是否能解决问题。我没想到这会起作用。
示例5
jshell> byte val = (byte)(1) - (byte)(one);
| Error:
| incompatible types: possible lossy conversion from int to byte
| byte val = (byte)(1) - (byte)(one);
| ^---------------------^
这个让我很困惑。我将两个组件都转换为字节,那么为什么会出现错误呢?毕竟在示例 1 中也有类似的操作,并且 Java 根本没有抱怨。
示例6
jshell> byte val = (byte)(1 - one);
val ==> 0
最终只有表达式的转换结果不会产生错误。为什么?
在计算表达式时,Java 会自动将每个
byte
、short
或 char
操作数提升为 int
。由于在计算表达式时操作数会自动提升为 int
,因此结果也会提升为 int
。因此,表达式的结果现在为 int
类型,如果不使用强制转换,则无法将其分配给 byte
。