在 Java 中在表达式中转换原始类型的规则是什么?[复制]

What are rules in casting primitive types in expressions in Java? [duplicate]

提问人:Argos 提问时间:9/10/2023 最后编辑:John BollingerArgos 更新时间:9/10/2023 访问量:54

问:

我试图弄清楚为什么有些铸件有效,为什么有些铸件不起作用。你能向我解释一下为什么其中一些例子有效而另一些则无效吗?

设置:

我正在使用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

最后,只有表达式的强制转换结果不会产生错误。为什么?

Java 转换 基元类型 JShell

评论

0赞 John Bollinger 9/10/2023
由于操作数自动升级为 类型,因此操作结果为 类型。byteint-int
1赞 Stephen C 9/10/2023
您需要阅读第二个 duplink 以了解为什么允许。(这不是jshell中的错误。JLS说它是有效的。byte val = 200 - 200;
0赞 Andy Turner 9/10/2023
这里的关键是你的变量不是 ,因此它的值不被视为常量表达式,即使你在赋值后从未更改过它的值。final

答:

2赞 FreackH 9/10/2023 #1

Java 在计算表达式时会自动提升每个 、 或操作数。由于在计算表达式时会自动将操作数提升为 ,因此结果也会提升为 。因此,表达式的结果现在是 类型 ,如果不使用强制转换,则无法将其分配给 a。byteshortcharintintintintbyte

评论

1赞 Andy Turner 9/10/2023
您需要稍微扩展一下以解释为什么允许。byte val = 200 - 200;