JLS如何与Sun javac对应/为什么它们不匹配

时间:2011-09-06 13:18:04

标签: java javac jls

在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中的错误?

3 个答案:

答案 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)。也许这很常见,我们应该放松规范而不是修复编译器?

  • 类别:
    的java:编译器
  • 发布固定:
    7(b25) - 据我所知,这意味着修复了Java 7的构建25
  • 评价:
      

    我倾向于放宽规范,但我们必须先了解其他实施方案,然后再对此进行最终调用。
      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

类型