Puzzle 10: Tweedledee

复合赋值符和String

一个话题也提到了复合赋值符的问题, 这里的问题也和它相关. 但这一次是让:

  • x = x + i; 合法
  • x += i; 非法.

复合操作符要求所有的操作数都是元数据类型或者对应的封装类型. 但有一个例外, += 允许在左边为String类型时, 右边为任意类型(JLS 15.26.2) .

赋值符=比较picky, 所以用的时候要小心, 要注意表达式右边和左边的类型兼容. (JLS 5.2)

这样的代码是没有问题的:

String a = "hello, ";

Object b = "world!";

int c = 999;

a += b;

a += c;

但如果把第一行改成

Object a = "hello, ";

就不能通过编译了.

  1. JLS 5.2 Assignment Conversion
  2. JLS 15.26.2 Compound Assignment Operators
  3. Puzzle 09: Tweedledum