Как объявить параметр метода как любое перечисление - программирование
Подтвердить что ты не робот

Как объявить параметр метода как любое перечисление

У меня есть метод, по которому мне нужно передать enum в качестве параметра.

public <T> T doSomething(SomeEnum operation, Class<T> something);

У меня есть несколько перечислений и метод является общим, который должен работать с любыми перечислениями. Каков правильный способ написания этой сигнатуры метода для принятия каких-либо общих типов перечислений? Я знаю, что для этой цели я могу использовать интерфейс маркера, но я хотел бы написать его с помощью общих подписей enum. Пожалуйста, посоветуйте мне об этом.

Какая плохая идея с приведенной ниже: (Это работает, но я получаю предупреждения от IDE, говорящие, что это сырой тип. Я не совсем понимаю причину).

 public void doSomething(Enum operation);
4b9b3361

Ответ 1

public <E extends Enum<E>> void doSomething(E operation);

EDIT: пример в соответствии с вашими изменениями:

public class Main {

    public enum Day {
        SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
        THURSDAY, FRIDAY, SATURDAY 
    }

    public <E extends Enum<E>> E doSomething(E operation, Class<E> klazz) {

        return operation;
    }

    public static void main(String[] args) {

        new Main().doSomething(Day.FRIDAY, Day.class);
    }

}

EDIT2:

если вам нужны T и Enum как отдельные типы, тогда вам понадобится:

public <T, E extends Enum<E>> T doSomething(E operation, Class<T> klazz) {

Ответ 2

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

public void doSomething(final Enum<?> operation);

который говорит, что он должен быть перечислением, но не какой-либо конкретной.

Ответ 3

Этот бит более очищен:

    public class EnumTest {

    protected static <E extends Enum<E>> void enumValues(Class<E> enumData) {
        for (Enum<E> enumVal: enumData.getEnumConstants()) {  
            System.out.println(enumVal.toString());
        }  
    }

    public static enum TestEnum {
        ONE, TWO, THREE;
    }

    public static void main(String param [] ) {
        EnumTest.enumValues(EnumTest.TestEnum.class);
    }
}