考虑下面的代码:
public class A {
public static void main(String[] args) {
Integer i = 9;
char c = 'a';
c = c*i; \\ compilation error
c *= i;
System.out.println(c);
}
}
我的疑问是c = c*i
给编译错误,但为什么不c *= i
知道我两个表达式都相等。
在功能上,表达式c = c * i;
和c *= i;
确实是等效的-它们应该做相同的事情。
但是,您在此处(int
和char
)使用不同的类型进行计算,并且Java编程语言具有关于在类型之间自动进行哪些转换(无强制转换)以及何时必须显式进行强制转换的规则。
在Java语言规范的第5章中详细描述了这些转换。
achar
和int
in的乘积产生c * i
类型的值int
,如5.6.2 Binary Numeric Promotion中所述。然后,您尝试将其分配给char
,这是一种缩小的原始转换,如果不进行强制转换,则无法完成。
15.26.2复合赋值运算符解释了诸如的运算符*=
。本段说明:
形式的复合赋值表达式
E1 op= E2
等效于E1 = (T) ((E1) op (E2))
,其中T
是的类型E1
,不同之处在于该表达式E1
仅被评估一次。
注意,隐式地完成了对左侧变量类型的转换。因此,如果这样做c *= i;
,则等效于:
c = (char)(c * i);
从int
到的转换char
是隐式完成的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句