Как передать перечисление в качестве параметра функции? - PullRequest
0 голосов
/ 11 октября 2011

Есть ли чистый способ передачи перечисления 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 * * 1015

1 Ответ

5 голосов
/ 11 октября 2011

Вы можете сделать это:

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);
    }
}
...