2011-10-10 14 views
0

関数に列挙CLASSを渡す明確な方法はありますか?列挙をパラメータとして関数に渡すにはどうすればよいですか?

public enum MyEnum implements XYZ { 

    //enum values 
    A, 
    B, 
    C; 
} 

public void getEnumeration(final Class<? extends XYZ> myEnum) { 

    //go through enumeration 
    for (XYZ xyz : myEnum.getEnumConstants() 
     System.out.println(xyz.toString()); 
} 

次のように渡された列挙:

はこのような何か考えてみましょう

getFunction(MyEnum.class); 

今...上記の作品と私はうまくgetEnumeration()関数に私の列挙を渡すことができます。しかし、私が渡しているのは実際には列挙型であり、XYZを実装するクラスではないことを確認したいと思います。 列挙型はクラスの型ですが、XYZを実装する列挙型の代わりにXYZを実装するクラスを渡すと、コンパイラがそれを受け取るような強い型の方法がありますか?

答えて

5

あなたはこれを行うことができます。

public class EnumTest { 
    public enum Runnables implements Runnable { 
     HELLO { 
      @Override 
      public void run() { 
       System.out.print("Hello, "); 
      } 
     }, 
     WORLD { 
      @Override 
      public void run() { 
       System.out.println("world!"); 
      } 
     }; 
    } 

    public static <T extends Enum<T> & Runnable> void getEnumeration(Class<T> myEnum) { 
     for (Runnable runnable : myEnum.getEnumConstants()) 
      runnable.run(); 
    } 

    public static void main(String[] args) { 
     getEnumeration(Runnables.class); 
    } 
} 
+0

グレート、私は「&」テンプレートで使用することができます知らなかった:

public static <T extends Enum<T> & XYZ> void getEnumeration(Class<T> myEnum) { // ... } 

は、ここで私は私の概念をテストするために書いた実際の例です。 ..今、あなたのアイデアを自分のコードで試してみて、質問があります。私は渡された列をクラスに格納する必要があります。私の変数は次のようになります: 'private myVar Class <? Enum <? XYZ >> 'を拡張しますか?変数にテンプレートを使用する方法がわかりません... – Ayyoudy

+1

そのタイプのクラスをパラメータ化します。例えば、 'public class MyClass &XYZ>'です。それから 'private class myVar;'を使ってください。 –

+0

いいですね。ありがとう – Ayyoudy