Java:如何传递代表 Enum 类的值?

标签 java class generics enums

动机:我想构造一个枚举来表示某些值族的所有可能值(我在这里犹豫说“类”)。枚举将有额外的方法、字段,甚至可能实现其他接口(interface)。然后我想将这个枚举传递给另一个方法,它将迭代所有可能的值(使用 Enum.values() 并做一些工作。

我研究并发现枚举 Foo实际上变成了Foo extends Enum<Foo> .这就是我不能扩展枚举的原因。我试图将我的方法参数定义为:

myMethod(Class<?> bar) {...}
myMethod(Class<? extends Enum> bar) {...}
myMethod(Class<? extends Enum<?>> bar) {...}

但是在方法内部,当我尝试一些基本的东西时,比如:

int i = bar.values().length;

它失败了。有没有其他方法可以做到这一点(或避免需要这样做)?

注意:我可以传递枚举的实际实例并使用 bar.getDeclaringClass()找到枚举类(而不是实例),但这非常难看。

最佳答案

尝试使用以下内容:

<E extends Enum<E>> void myMethod(Class<E> enumType) {
    E[] values = enumType.getEnumConstants();
    ...
}

来自getEnumConstants()文档:

Returns the elements of this enum class or null if this Class object does not represent an enum type.

编辑:如果您使用不同的枚举类型实现共享接口(interface),您可以修改您的方法以便能够调用接口(interface)方法。例如:

interface Fooable {
    void foo();
}

...

<E extends Enum<E> & Fooable> void myMethod(Class<E> enumType) {
    E[] values = enumType.getEnumConstants();
    for (E value : values) {
        value.foo();
    }
}

关于Java:如何传递代表 Enum 类的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13150477/

相关文章:

java - Nashorn (es6) 损坏的函数范围

java - 如何在不知道类名的情况下调用方法?

ios - 类变量在重新初始化后保持不变

java - 非静态内部类名作为类型参数

java - 如何在 CDI 生成器中检索通用参数的类?

java - 与 JVM 进行的常规 GC 调整相比,JProfiler "Run GC"按钮用于清理垃圾有何作用

java - 树集的工作

jvm中的Java对象ID

c++ - 多类中的多线程

Java 泛型 - Make Generic 扩展 2 个接口(interface)