在Java中给出了这个:
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 Compound Assignment Operators中的这一行解释:
All compound assignment operators require both operands to be of primitive type, except for +=, which allows the right-hand operand to be of any type if the left-hand operand is of type String.
但是在JLS第三版中,这个评论消失了,关于复合运算符的唯一说法就是15.26.2 Compound Assignment Operators:
A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.
似乎不起作用(见上文)。
所以我的问题是 - javac和JLS之间究竟是什么关系,这个特殊的例子是javac中的错误还是JLS中的错误?
答案 0 :(得分:4)
编译器错误是您的javac版本中的错误。正如pointed in prior answer这个错误在Java 7中得到修复。
请参阅Sun bug数据库中的Bug ID 7058838:
描述:
以下函数无法在java 1.6或更低版本中编译。但它可以在java 1.7中编译
public static void main(String[] args) {
Object x = "x";
String y = "y";
x += i;
}
对于Object x和String y,x + = y只是x =(Object)(x + y)。因为y是一个String,所以x经过字符串转换以产生一个与y连接的字符串,然后在no-op强制转换为Object之前。 SE 6和SE 7之间的JLS没有变化;该计划多年来一直合法。
有关背景信息,请参阅旧Bug Id 4741726
javac用于允许表达式
o += s
的表达式,其中o是Object类型的变量,s是String类型的表达式。我们最近解决了这个问题(4642850),这导致了构建失败(4741702)。也许这很常见,我们应该放松规范而不是修复编译器?
我倾向于放宽规范,但我们必须先了解其他实施方案,然后再对此进行最终调用。
2002-09-04
JLS3允许Object + = String,因为'+'表示字符串连接,并且能够像使用Object的String一样容易地将Object与String连接。 2008-01-31
答案 1 :(得分:2)
应该是一个javac bug。
在javac 7中编译好。所以有人报告了它并且它已经修复了。
答案 2 :(得分:0)
从本质上讲,你回答了自己的问题:
All compound assignment operators require both operands to be of primitive type, except for +=, which allows the right-hand operand to be of any type if the left-hand operand is of type String.
请注意,您的左手操作数不是String
类型