我有以下代码行
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”
请帮忙。
答案 0 :(得分:12)
那是因为复合赋值运算符执行隐式转换。
来自JLS Compound Assignment Operator:
E1 op= E2
形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,但E1
仅被评估一次。
如果是二进制+
运算符,则必须明确进行转换。完成第4项任务:
intnum = (int)(intnum+longnum);
它会起作用。这就是您的复合赋值表达式的计算结果。
答案 1 :(得分:11)
我认为第3行和第4行执行相同的任务,那么为什么编译器在第4行显示错误“类型不匹配:无法从long转换为int”
因为他们不做做同样的事情。复合赋值运算符具有隐式转换。
E1 op= E2
形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,但E1
仅被评估一次。
所以你的第三行更像是:
intnum = (int) (intnum + longnum);
强制转换是必需的,因为在intnum + longnum
表达式中,binary numeric promotion在long
arithemtic中执行加法之前应用long
,结果为long
。没有从int
到{{1}}的隐式转换,因此是演员。
答案 2 :(得分:0)
Long id = 50;
Integer sum = Integer.valueOf(Long.toString(id));