На 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 Составные операторы присваивания :
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 Составные операторы присваивания :
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?