3

我有以下几行代码

long longnum = 555L;
int intnum = 5;
intnum+=longnum;
intnum= intnum+longnum; //Type mismatch: cannot convert from long to int
System.out.println("value of intnum is: "+intnum);

我认为第 3 行和第 4 行执行相同的任务,那么为什么编译器在第 4 行显示错误“类型不匹配:无法从 long 转换为 int”

请帮忙。

4

3 回答 3

12

这是因为复合赋值运算符会进行隐式转换。

来自JLS 复合赋值运算符

形式的复合赋值表达式E1 op= E2等价于E1 = (T) ((E1) op (E2)),其中T是 的类型E1,除了E1只计算一次。

而在二元+运算符的情况下,您必须显式地进行强制转换。做你的第四个任务:

intnum = (int)(intnum+longnum);

它会起作用的。这就是您的复合赋值表达式的计算结果。

于 2013-10-05T11:10:40.837 回答
11

我认为第 3 行和第 4 行执行相同的任务,那么为什么编译器在第 4 行显示错误“类型不匹配:无法从 long 转换为 int”

因为他们不做同样的事情。复合赋值运算符具有隐式强制转换。

JLS 的第 15.26.2 节

形式的复合赋值表达式E1 op= E2等价于E1 = (T) ((E1) op (E2)),其中T是 的类型E1,除了E1只计算一次。

所以你的第三行更像是:

intnum = (int) (intnum + longnum); 

强制转换是必需的,因为在表达式中intnum + longnum,在算术中执行加法之前应用二进制数字提升long,结果为long. 没有从longto的隐式转换int,因此是演员表。

于 2013-10-05T11:10:57.070 回答
0
Long id = 50;
Integer sum = Integer.valueOf(Long.toString(id));
于 2021-01-21T15:53:08.410 回答