2016-05-06 14 views
0

SomeInterfaceを実装する "enum"にSomeEnum1またはSomeEnum2を割り当てる方法を教えてください。私はそれがクラスでありenumではないので、インターフェイスを直接指定することはできません。インタフェースを使用するためにenumを使用するにはどうすればよいですか?

私は確かにこの作業を行うために構文の砂糖を指定しているが、私はそれを把握することはできません。

例:

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

?その場合、 'Enum'を拡張するには' SomeInterface'が必要ですが、これは不可能です。 'SomeInterface'を' SomeAbstractClass'に置き換えても、すべての 'enum'が' java.lang.Enum'から拡張され、Javaが多重継承をサポートしていないので、それはまだできません。 –

+0

'SomeEnum1またはSomeEnum2を「enum」に割り当てることはできますが、enumは拡張できません。 – user902383

答えて

1

メソッドに値を渡す場合は、2つの制約によってSomeInterfaceの種類を制限するためにジェネリックを使用することができますので、あなたは `enum`として` SomeInterface`を使用したい

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

これは私が欲しかったものです。このように '&'を使うことはできませんでした。 – Zhro

0

代わりに列挙インターフェイスを実装作るのは、静的メソッドを宣言し、それぞれの列挙値の実装を提供することができます。

あなたはこのようにそれを使用することができる方法
public enum Animal { 

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

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

    public abstract void makeNoise(); 

} 

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

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

あなたがすることはできません。
enum型は、Javaでは、その列挙型に対して定義された値のみを持つことができます。

あなたが実際に自分自身をansered欲しいものに近いもの:

SomeInterface e2 = SomeEnum1.something1; 

編集:name()メソッドを使用できるようにするために、あなたがそうのようなインターフェイスに追加する必要があります。

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

この方法は既にEnumで利用できるため、再実装する必要はありません。

これを列挙型にする理由はありますか?このアプローチを使用すると、 SomeInterfaceで定義されているすべての機能が利用できます。私はここで列挙型が必要な理由を想像できません - >私の答えがあなたが必要とするものに近いものでないかどうかを詳しく教えてください。

+0

インターフェイスに実装することなく' .name() 'へのアクセスを維持したいのです。私が実装しても、 '@ Override'を実行すると' .name() 'を呼び出すことができます。 – Zhro

+0

'name()'をインターフェースに追加するだけです。私の編集された答えを参照してください - >それが必要です。 – founderio

0

あなたがすることができ、簡単な操作を行います。

SomeInterface e2 = SomeEnum1.something1; 

問題はe2name()メソッドを持っていない任意のクラスで実現することができるインタフェースも、クラスであるということです。あなたはSomeInterface型の参照からそのメソッドにアクセスしたいのであれば、あなたはインターフェイスに含める必要があります:

しかし
interface SomeInterface { 
    String name(); 
} 

、あなたがそれに切り替えることはできませんので、SomeInterfaceはまだ列挙型ではないことに注意してくださいEnumSetEnumMapなどは使用できません。通常、より良い解決策があります。

関連する問題