31

我有一个方法,我需要将枚举作为参数传递。

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

我有几个枚举,该方法是一种常见的方法,应该适用于任何枚举。编写此方法签名以接受任何通用枚举类型的正确方法是什么?我知道我可以为此目的使用标记接口,但我想用通用枚举签名来编写它。请就此给我建议。

以下是什么坏主意:(它有效,但我从 IDE 收到警告说它是原始类型。我不清楚原因)。

 public void doSomething(Enum operation);
4

3 回答 3

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

编辑:根据您的修改的示例:

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

}

编辑2:

如果您需要 T 和 Enum 作为单独的类型,那么您将需要:

public <T, E extends Enum<E>> T doSomething(E operation, Class<T> klazz) {
于 2012-07-11T14:38:56.677 回答
13

你可以这样做:

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

它说它需要是一个枚举,但不是任何特定的。

于 2012-07-11T14:38:26.983 回答
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);
    }
}
于 2017-05-22T14:55:27.940 回答