【问题标题】:How to declare a method parameter as any enum如何将方法参数声明为任何枚举
【发布时间】:2012-07-11 14:36:52
【问题描述】:

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

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

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

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

 public void doSomething(Enum operation);

【问题讨论】:

    标签: java generics enums


    【解决方案1】:
    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);
        }
    
    }
    

    EDIT2:

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

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

    【讨论】:

    • 这就是要走的路。另请参阅 EnumSet 以获取此操作的示例:docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumSet.html
    • 您好,感谢您的回复,但我无法添加此部分,因为它再次抱怨签名问题。对不起,我应该张贴我正在寻找的确切签名。请查看我对现有方法签名的编辑,我需要在其中添加您提到的内容。在这种情况下,方法签名会是什么样子???
    • 这是您要找的吗?还是 T 和枚举应该是单独的类型?
    • 这对我来说非常有效,但我不明白为什么函数看起来有两个返回参数,&lt;E extends Enum&lt;E&gt;&gt;E
    【解决方案2】:

    你可以这样做:

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

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

    【讨论】:

    • 澄清一下:这基本上只是消除了警告(因为EnumEnum&lt;?&gt; 是同一件事,但其中一个是明确的)。
    • @BrendanLong: EnumEnum&lt;?&gt; 不是一回事。例如您可以向List 添加内容,但不能向List&lt;?&gt; 添加任何内容
    【解决方案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);
        }
    }
    

    【讨论】:

    • 您的解决方案没有显示如何传递枚举实例,例如调用一个方法并传递它 TestEnum.One
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2013-08-25
    相关资源
    最近更新 更多