类型不匹配:无法将长整型转换为整型。

4
我有以下这些代码行。
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”?
请帮忙。
3个回答

12
那是因为复合赋值运算符会进行隐式转换。
来自JLS Compound Assignment Operator
一个形如E1 op= E2的复合赋值表达式相当于E1 = (T) ((E1) op (E2)),其中TE1的类型,但E1只被计算一次。
而在二元+运算符的情况下,你需要显式进行类型转换。将你的第四个赋值语句修改为:
intnum = (int)(intnum+longnum);

它会起作用。这就是你的复合赋值表达式被评估的结果。


11
我认为第3行和第4行执行相同的任务,那么为什么编译器在第4行上显示错误“类型不匹配:无法将long转换为int”?
因为它们并不做同样的事情。复合赋值运算符中含有一个隐式转换。
来自JLS第15.26.2节

形如E1 op= E2的复合赋值表达式等效于E1 = (T) ((E1) op (E2)),其中TE1的类型,除了E1只会被评估一次。

所以你的第三行更像是:
intnum = (int) (intnum + longnum); 

需要进行类型转换是因为在表达式 intnum + longnum 中,会先应用二进制数值提升,然后再进行long算术运算,其结果为long。由于没有从longint的隐式转换,因此需要进行强制转换。请注意保留HTML标记。

大师的回答! - Orel Eraki
或许是大师,但Rohit打得比他快17秒。为什么他的回答完全相同却没有获得更多的赞成票还是个谜。我猜Skeet效应发挥了作用。 - Dawood ibn Kareem

0
Long id = 50;
Integer sum = Integer.valueOf(Long.toString(id));

请解释您的答案,并将其格式化,以便能够清楚地理解。 - kk.
虽然这段代码可能提供了问题的解决方案,但最好添加上为什么/如何运作的上下文。这可以帮助未来的用户学习,并将这些知识应用到他们自己的代码中。当代码被解释时,您还可能会得到用户的积极反馈,例如点赞。 - borchvm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接