类型不匹配:无法从long转换为int

我有以下几行代码

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”

请帮忙。

那是因为复合赋值运算符执行隐式转换。

来自JLS化合物分配操作员 :

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

在二元+运算符的情况下,您必须明确地进行转换。 完成第4项任务:

 intnum = (int)(intnum+longnum); 

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

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

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

从JLS第15.26.2节 :

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

所以你的第三行更像是:

 intnum = (int) (intnum + longnum); 

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