Java 表达式中基本类型的转换规则是什么? [重复]

问题描述 投票:0回答:1

我试图找出为什么有些铸件有效而其他铸件不起作用。您能向我解释一下为什么其中一些示例有效而其他示例无效吗?

设置:

我正在使用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 casting primitive-types jshell
1个回答
0
投票

在计算表达式时,Java 会自动将每个

byte
short
char
操作数提升为
int
。由于在计算表达式时操作数会自动提升为
int
,因此结果也会提升为
int
。因此,表达式的结果现在为
int
类型,如果不使用强制转换,则无法将其分配给
byte

© www.soinside.com 2019 - 2024. All rights reserved.