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 static <T extends Enum<T> & XYZ> void getEnumeration(Class<T> myEnum) { 
    // ... 
} 

Вот конкретный пример, я написал, чтобы проверить свою концепцию:

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

Великий, не знал, я мог бы использовать «&» в шаблонам. .. теперь, я попробовал вашу идею с моим кодом и задал вопрос. Мне нужно сохранить переданные в перечислении в моем классе. Так будет ли моя переменная чем-то вроде: 'private myVar Class > '? Я не уверен, как использовать шаблоны для переменных ... – Ayyoudy

+1

Параметр вашего класса в этом типе: например, 'public class MyClass & XYZ>'. Затем просто используйте 'private Class myVar;'. –

+0

Звучит неплохо. благодаря – Ayyoudy