Wie JLS Sun Javac entspricht / warum sie nicht übereinstimmen
Frage
In Java gegeben:
String a = "str";
CharSequence b = "charseq";
Du kannst schreiben
b = b + a;
kann aber nicht schreiben (gibt einen Compiler -Fehler)
b += a;
Der Fehler ist
incompatible types
found : java.lang.CharSequence
required: java.lang.String
Jetzt in der zweiten Ausgabe der JLS wurde dies durch diese Zeile in erklären 15.26.2 Verbindungszuweisungsoperatoren:
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.
In der dritten Ausgabe von JLS verschwand jedoch dieser Kommentar, das einzige, was über zusammengesetzten Operator gesagt wird 15.26.2 Verbindungszuweisungsoperatoren:
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.
Was nicht zu funktionieren scheint (siehe oben).
Meine Frage ist also - wie genau ist die Beziehung zwischen Javac und JLS und ist dieses Beispiel ein Fehler in Javac oder ein Fehler in JLS?
Lösung
Compiler -Fehler ist ein Fehler in Ihrer Version Javac. Wie in der vorherigen Antwort gezeigt Dieser Fehler ist in Java 7 behoben.
Siehe zB Fehler -ID 7058838 in der Sun Bug -Datenbank:
Bezeichnung:
Eine folgende Funktion kann nicht in Java 1.6 oder weniger kompiliert werden. Aber es kann in Java 1.7 zusammengestellt werden.
public static void main(String[] args) { Object x = "x"; String y = "y"; x += i; }
- Zustand:
Kein Defekt - Auswertung:
Für ein Objekt x und eine Zeichenfolge y ist x+= y nur x = (Objekt) (x+y). Da y eine Zeichenfolge ist, unterliegt X eine String-Umwandlung, um eine Schnur zu erstellen, die mit y verkettet ist, bevor das No-op-Guss zum Objekt gegossen wird. Das JLS hat sich in diesem Bereich zwischen SE 6 und SE 7 nicht verändert; Das Programm sollte seit vielen Jahren legal sein.
Für einen Hintergrund siehe auch alt Fehler -ID 4741726
- Bezeichnung:
Javac wurde verwendet, um Ausdrücke der Form zu ermöglichen
o += s
wobei O eine Variable des Typs Objekt und S ist ein Ausdruck der Typ -Zeichenfolge. Wir haben das kürzlich behoben (4642850) und dies verursachte einen Bauversagen (4741702). Vielleicht ist dies üblich genug, dass wir die Spezifikation entspannen sollten, anstatt den Compiler zu reparieren? - Kategorie:
Java: Compiler - FILDELTEFAHREN:
7 (B25) - Soweit ich verstehe, bedeutet dies, dass dies in Build 25 von Java 7 festgelegt ist - Auswertung:
Ich bin geneigt, die Spezifikation zu entspannen, obwohl wir wissen mussten, was andere Implementierungen tun, bevor wir einen letzten Anruf tätigen.
2002-09-04
JLS3 ermöglicht Objekt+= String, da die '+' String -Verkettung bedeutet und dies in der Lage ist, ein Objekt mit einer Zeichenfolge so einfach wie eine Zeichenfolge mit einem Objekt zu verkettet.
2008-01-31
Andere Tipps
sollte dann ein Javac -Fehler sein.
Kompiliert gut in Javac 7. Also hat jemand es gemeldet und es ist repariert.
Im Wesentlichen haben Sie Ihre eigene Frage beantwortet:
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.
Beachten Sie, dass Sie linkshändige Operanden nicht von Typ String sind