Java:如何从一个通用类型对象实例中获取枚举类的值?

4

我希望创建一个枚举编辑器,它以枚举类型作为其泛型。 E是一个泛型类型,但被限制为枚举类型。我该如何从实例e中获取枚举类的值?

public class ComboBoxEnumEditor<E extends Enum<E>>{
    public ComboBoxEnumEditor(E e) {
        // how to get values of E from e?
        // attemp1:
        List values = e.getClass().values();
        // attemp2:
        List values = ((Enum.class)e.getClass()).values();
        // attemp3:
        List values = ((Enum.class)e.getClass()).values();
        // none of the above works... 
    }
}

假设我有一个枚举类型

public enum Location {
    Default( false, EAttributeLocation.MAIN_TABLE_IF_AVAILABLE ),
    Main( false, EAttributeLocation.MAIN_TABLE ),
    Overflow( false, EAttributeLocation.OVERFLOW_TABLE ),
    Separate( false, EAttributeLocation.SEPARATE_TABLE );
    ......
}

我希望我的ComboBoxEnumEditor能够实现以下功能:
{
   ComboBoxEnumEditor(new Location());
}

Please help, thanks.

3个回答

14

看起来你正在寻找某个东西(但我可能错了)

Enum[] values = e.getClass().getEnumConstants();

或者如@pbabcdefp此回答中所述(他的回答很赞),如果您想要E[]而不是Enum[]

E[] values = e.getDeclaringClass().getEnumConstants();

根据情况,你的参数应该是Class<E> clazz而不是E e本身,因为你可以将其与ComboBoxEnumEditor(Location.class);一起使用。在这种情况下,你可以简单地使用:

...它以Enum类作为其泛型。

E[] values = clazz.getEnumConstants();

这是我会做的方式。如果您需要执行高效的集合操作,EnumSet.allOf(enumClass)也可能非常有用。 - Mike Strobel

5
E[] arr = e.getDeclaringClass().getEnumConstants();

非常感谢,这正是我在寻找的。我希望我能把你和Pshemo都选为答案,但他稍微快了一点。 - Alex
如果 OP 真的打算使用 E e,那么 e.getDeclaringClass() 会很好。但是,使用参数 Class<E> clazz 而不是 E[] values = clazz.getEnumConstants(); 编译也可以通过。 - Pshemo
@Alex 不用担心,Pshemo的回答比我的更详细。请看这里:https://dev59.com/9Ibca4cB1Zd3GeqPas4g#27893065 - Paul Boddington
@Pshemo 我同意使用 clazz 更好。我应该在我的答案中提到它,所以给你加一分。在我看来,Java 枚举除了由于获取常量的 3 种方式 (values()getEnumConstants()EnumSet.allOf()) 而导致的混淆外,是非常优秀的。 - Paul Boddington
是的,那是真的,我们感到很困扰,因为 Enum 没有(甚至可能是抽象的)values() 方法,因为它由编译器动态添加到每个特定的枚举中。如果有这个方法会让我们的生活更容易。 - Pshemo

0

简短回答...你不能这样做。这是无效的语法,因为你不能实例化一个枚举:

ComboBoxEnumEditor(new Location());

相反,您需要传递枚举类并更改方法签名,例如:

ComboBoxEnumEditor(Location.class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接