String a = "str";
CharSequence b = "charseq";
你可以编写代码。
b = b + a;
但是不能编写(会产生编译器错误)。
b += a;
错误信息为:
incompatible types
found : java.lang.CharSequence
required: java.lang.String
现在在JLS第二版中,可以通过15.26.2 复合赋值运算符中的这一行来解释:
所有复合赋值运算符都要求两个操作数都是原始类型,除了+=,如果左操作数为String类型,则允许右操作数为任何类型。
但是在JLS第三版中,这条注释消失了,关于复合运算符唯一需要注意的事项在15.26.2 复合赋值运算符中提到:
形式为E1 op=E2的复合赋值表达式等价于E1=(T)((E1)op(E2)),其中T是E1的类型,只不过E1只被计算一次。
看起来这并不起作用(请参见上文)。
因此我的问题是 - javac和JLS之间的关系究竟是什么,这个特定的例子是javac中的错误还是JLS中的错误?
Object
代替CharSequence
应该也会发生同样的情况。) - Paŭlo Ebermann