Как объявить параметр метода как любое перечисление
У меня есть метод, по которому мне нужно передать enum в качестве параметра.
public <T> T doSomething(SomeEnum operation, Class<T> something);
У меня есть несколько перечислений и метод является общим, который должен работать с любыми перечислениями. Каков правильный способ написания этой сигнатуры метода для принятия каких-либо общих типов перечислений? Я знаю, что для этой цели я могу использовать интерфейс маркера, но я хотел бы написать его с помощью общих подписей enum. Пожалуйста, посоветуйте мне об этом.
Какая плохая идея с приведенной ниже: (Это работает, но я получаю предупреждения от IDE, говорящие, что это сырой тип. Я не совсем понимаю причину).
public void doSomething(Enum operation);
Ответы
Ответ 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);
}
}