提问人:Argos 提问时间:9/10/2023 最后编辑:John BollingerArgos 更新时间:9/10/2023 访问量:54
在 Java 中在表达式中转换原始类型的规则是什么?[复制]
What are rules in casting primitive types in expressions in Java? [duplicate]
问:
我试图弄清楚为什么有些铸件有效,为什么有些铸件不起作用。你能向我解释一下为什么其中一些例子有效而另一些则无效吗?
设置:
我正在使用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;
| ^-----^
当我将一个文字切换到一个变量时,代码突然无法编译。强制转换压缩的任何或所有组件并不能解决问题。
示例 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
最后,只有表达式的强制转换结果不会产生错误。为什么?
答:
2赞
FreackH
9/10/2023
#1
Java 在计算表达式时会自动提升每个 、 或操作数。由于在计算表达式时会自动将操作数提升为 ,因此结果也会提升为 。因此,表达式的结果现在是 类型 ,如果不使用强制转换,则无法将其分配给 a。byte
short
char
int
int
int
int
byte
评论
1赞
Andy Turner
9/10/2023
您需要稍微扩展一下以解释为什么允许。byte val = 200 - 200;
评论
byte
int
-
int
byte val = 200 - 200;
final