2016-05-06 13 views
0

Wie kann ich SomeEnum1 oder SomeEnum2 einer "enum" zuweisen, die SomeInterface implementiert? Ich kann die Schnittstelle nicht direkt angeben, da es sich um eine Klasse und nicht um eine Enumeration handelt.Wie benutzt man eine Enumeration, wie man eine Schnittstelle benutzen würde?

Ich bin sicher, es gibt eine Angabe syntaktischen Zucker, um diese Arbeit zu machen, aber ich kann es nicht herausfinden.

Beispiel:

public class Main { 
    public interface SomeInterface { 
     public String doSomething(); 
    } 

    public enum SomeEnum1 implements SomeInterface { 
     something1; 

     @Override 
     public String doSomething() { 
     return "SomeEnum1"; 
     } 
    } 

    public enum SomeEnum2 implements SomeInterface { 
     something2; 

     @Override 
     public String doSomething() { 
     return "SomeEnum2"; 
     } 
    } 

    public static void main(String[] args) { 
     // Works but not polymorphic 
     SomeEnum1 e1 = SomeEnum1.something1; 
     System.out.println(e1.name() + " " + e1.doSomething()); 

     // Not an enum 
     // SomeInterface e2 = SomeEnum1.something1; 
     // System.out.println(e2.name() + " " + e2.doSomething()); 

     // Bounds mismatch 
     // Enum<SomeInterface> e3 = SomeEnum1.something1; 
     // System.out.println(e3.name() + " " + e3.doSomething()); 
    } 
} 
+0

so möchten Sie 'SomeInterface' als' enum' benutzen? In diesem Fall benötigen Sie 'SomeInterface', um' Enum' zu erweitern, was nicht möglich ist. Auch wenn Sie 'SomeInterface' durch' SomeAbstractClass' ersetzt haben, ist dies immer noch nicht möglich, da alle 'Enum's von' java.lang.Enum' ausgehen und Java keine Mehrfachvererbung unterstützt. –

+0

'Wie kann ich SomeEnum1 oder SomeEnum2 zu einem" Enum "zuweisen? Sie können nicht, enums kann nicht erweitert werden – user902383

Antwort

1

Wenn Sie den Wert an eine Methode übergeben, können Sie Generika verwenden, um die Art von SomeInterface von 2 Einschränkungen zu beschränken:

public static void main(String[] args) { 
    print(SomeEnum1.something1); 
} 

public static <T extends Enum & SomeInterface> void print(T t) { 
    System.out.println(t.name() + " " + t.doSomething()); 
} 
+0

Das ist genau das, was ich wollte. Ich hatte keine Ahnung, dass du '&' auf diese Weise benutzen kannst. – Zhro

0

anstatt die Enum eine Schnittstelle implementieren, können Sie eine statische Methode deklarieren und eine Implementierung für jeden Enum-Wert liefern.

public enum Animal { 

    DOG { 
     public void makeNoise() { System.out.println("Bark bark!"); } 
    }, 

    CAT { 
     public void makeNoise() { System.out.println("Prrrrr!"); } 
    }; 

    public abstract void makeNoise(); 

} 

diese Weise können Sie es wie folgt verwenden können:

Animal animal = Animal.DOG; 
animal.makeNoise(); // prints "Bark bark!"; 

animal = Animal.CAT; 
animal.makeNoise(); // prints "Prrrrr!" 
0

Sie können nicht.
Ein Aufzählungstyp kann in Java nur Werte für diesen Aufzählungstyp definiert haben.

Die nächste Sache, was Sie wollen Sie sich wirklich ansered:

SomeInterface e2 = SomeEnum1.something1; 

Edit: Lage sein, die name() Methode zu verwenden, müssen Sie es an die Schnittstelle wie so hinzuzufügen:

public interface SomeInterface { 
    public String doSomething(); 
    public String name(); 
} 

Da diese Methode für jedes Enum bereits verfügbar ist, müssen Sie es nicht erneut implementieren.

Gibt es bestimmte Gründe, warum Sie möchten, dass das eine Enum ist? Mit diesem Ansatz erhalten Sie alle Funktionen, die in SomeInterface definiert sind. Ich kann mir nicht vorstellen, warum du hier eine Aufzählung benötigst -> bitte erarbeite, ob meine Antwort nicht genau dem entspricht, was du brauchst.

+0

Der Grund, ich will den Zugriff auf' .name() 'behalten, ohne es in der Schnittstelle zu implementieren . Auch wenn ich es implementiere, kann ich dann '.name()' aufrufen, wenn ich '@ Override'. – Zhro

+0

Fügen Sie einfach 'name() 'zur Schnittstelle hinzu. Sehen Sie meine bearbeitete Antwort -> das sollte es tun. – founderio

0

Sie können einfach do:

SomeInterface e2 = SomeEnum1.something1; 

Das Problem ist, dass e2 ist eine Schnittstelle, die von jeder Klasse implementiert werden können, auch Klassen, die keine name() Methode haben. Also, wenn Sie diese Methode aus SomeInterface -Typ Referenzen zugreifen möchten, werden Sie es in der Schnittstelle enthalten müssen:

interface SomeInterface { 
    String name(); 
} 

Beachten Sie jedoch, dass SomeInterface ist noch nicht eine Enumeration, so schalten Sie können nicht auf sie , kann nicht EnumSet und EnumMap usw. verwenden. Normalerweise gibt es bessere Lösungen.