2016-07-29 12 views
0

Ich arbeite mit JavaFX-Anwendung und versuche, separate Enum mit allen Pfaden zu erstellen. Hier ist der Code.schlechte Operandentypen für binären Operator '+' während des Druckens enum

enum Paths { 
    STYLE_SHEETS("../stylesheets"), 
    CONTROLLER("../controller"), 
    CONNECTION("../connection"), 
    RESOURCE("../resource"), 
    VIEWS("../views"), 
    APPLICATION("../application"), 
    MOVE_UP(".."); 

    private final String path; 

    private Paths(final String value) { 
     this.path = value; 
    } 

    @Override 
    public String toString() { 
     return path; 
    } 
} 
public class Test{ 
    public static void main(String[] args){ 
     System.out.println(Paths.MOVE_UP + Paths.VIEWS); 
    } 
} 

Aber wenn ich versuche, zwei Enum-Instanz zu kombinieren, habe ich den Fehler.

Test.java:29: error: bad operand types for binary operator '+' 
       System.out.println(Paths.MOVE_UP + Paths.VIEWS); 
               ^
    first type: Paths 
    second type: Paths 
1 error 

1) Warum bekomme ich diesen Fehler?

2) Ist es eine gute Möglichkeit, enum Pfade zu erstellen und in der Controller-Klasse zu verwenden, wo Sie auf das Verzeichnis zugreifen möchten. (Dies ist optional Frage. Die Beantwortung dieser Frage wird Bonus für mich.)

+2

'System.out.println (Paths.MOVE_UP.name() + Paths.VIEWS.name());' Sie concatentate zwei Aufzählungen – SMA

+0

Verwendung .toString kippen() – mayha

+0

@mayha Paths.MOVE_UP zurückkehren ein Faden. – UnKnown

Antwort

4

Sie diese ziemlich schnell bye lösen Hinzufügen der toString() Methode.

Warum brauchen Sie die toString() Methode?

Weil es mehrdeutig wäre. Java konvertiert nur in String # append, wenn es weiß, dass mindestens ein Teil eine Zeichenkette sein soll. - @Silverclaw

Aktualisiert Code:

enum Paths { 
STYLE_SHEETS("../stylesheets"), 
CONTROLLER("../controller"), 
CONNECTION("../connection"), 
RESOURCE("../resource"), 
VIEWS("../views"), 
APPLICATION("../application"), 
MOVE_UP(".."); 

private final String path; 

private Paths(final String value) { 
    this.path = value; 
} 

@Override 
public String toString() { 
    return path; 
} 
} 
public class test{ 
    public static void main(String[] args){ 
     System.out.println(Paths.MOVE_UP.toString() + Paths.VIEWS.toString()); 
} 
} 

Edited Abwicklung:

Für mehr Verständnis muss Java + Operator lösen, zuerst, dann wird es also zu System.out.println(); passieren, wie Sie toString() erwartet sollte aufgerufen werden, wird es nicht aufrufen, weil keine Enum zu println(); geht sie müssen + Operator zuerst zu lösen, und Enum haben nichts mit + das ist, warum Sie erhalten Dieser Fehler wird angezeigt.

+0

Warum? können Sie erklären? 'System.out.println (Paths.MOVE_UP);' Es wird gut funktionieren und ich werde String bekommen. – UnKnown

+0

@UnKnown Sie können nicht den + Operator zwischen 2 enums verwenden (siehe Mureiniqs Antwort) – mayha

+1

Weil es mehrdeutig wäre. Java konvertiert nur in String # append, wenn es weiß, dass mindestens ein Teil eine Zeichenkette sein soll. – Silverclaw

2

können Sie nicht den + Operator zwischen zwei ENUM-Werte verwenden, da der Fehler sagt. Zumindest die Operanden sollten eine Zeichenkette sein, damit Java die andere auch implizit in eine Zeichenkette umwandelt. ZB:

public static void main(String[] args){ 
    System.out.println(Paths.MOVE_UP.toString() + Paths.VIEWS); 
    // Here -------------------------^ 
} 
+0

Ich weiß nicht, warum ich das brauche? Ich überschreibe bereits 'toString();' Methode in Enum, so sollte es funktionieren. – UnKnown

+1

@UnKnown überschreiben 'toString()' hat nichts damit zu tun. Sie müssen Java immer noch signalisieren, dass Sie den Operator '+' als Konkatinationsoperator zwischen zwei Strings verwenden möchten. – Mureinik

+0

Warum? Es sieht Bugs in Java aus. Kannst du es bitte mehr erklären? Warum benötigt Java dieses Signal? kannst du mir einen Link geben, um über diesen zu lesen. – UnKnown

1

Entweder man explizit der toString() -Methode aufrufe

System.out.println(Paths.MOVE_UP.toString() + Paths.VIEWS.toString()); 

oder eine leere Zeichenfolge vor Ihrer Aufzählung hinzufügen (wie Sie tun würden, ganze Zahlen verketten, anstatt sich zu addieren

)
System.out.println("" + Paths.MOVE_UP + Paths.VIEWS); 
1

Das Verhalten wird in JLS Sec 15.18 "Additive Operators" angegeben:

Wenn der Typ eines der Operanden eines Operators + String ist, dann ist die Operation eine String-Verkettung.

Andernfalls muss der Typ jedes Operanden des Operators + ein Typ sein, der in einen primitiven numerischen Typ konvertierbar ist (§5.1.8), oder es tritt ein Fehler bei der Kompilierung auf.

Keiner Ihrer Operanden ist ein String; Keiner Ihrer Operanden ist in einen primitiven numerischen Typ konvertierbar.Also:

ein Fehler bei der Kompilierung auftritt

Sie können entweder Kraft (mindestens) einer der Operanden sein, um einen String:

Paths.MOVE_UP.toString() + Paths.VIEWS 

oder Pre-verketten mit der Leerstring:

"" + Paths.MOVE_UP + Paths.VIEWS 

entspricht

("" + Paths.MOVE_UP) + Paths.VIEWS