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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top