首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果我不知道编译时的类,如何获取Enum的值?

如果我不知道编译时的类,如何获取Enum的值?
EN

Stack Overflow用户
提问于 2011-03-10 23:46:21
回答 3查看 8.8K关注 0票数 19

我正在尝试做以下几件事:

代码语言:javascript
复制
Class<?> cls = unknownClass;
if(cls.isEnum()){
    @SuppressWarnings("unchecked")
    Class<? extends Enum<?>> enumClass = (Class<? extends Enum<?>>) cls;
    Object val = Enum.valueOf(enumClass, "NAME1");
}

但我得到以下错误:

代码语言:javascript
复制
Bound mismatch: The generic method valueOf(Class<T>, String) of type Enum<E> is 
not applicable for the arguments (Class<capture#5-of ? extends Enum<?>>, String). 
The inferred type capture#5-of ? extends Enum<?> is not a valid substitute for 
the bounded parameter <T extends Enum<T>>   

谁能告诉我我哪里做错了?

EN

回答 3

Stack Overflow用户

发布于 2011-03-10 23:53:23

问题是你有两个?,它们可能是不同的,但它们必须是相同的。

要么必须使用非泛型类型,要么像这样声明泛型类型

代码语言:javascript
复制
public static <T extends Enum<T>> T val(Class<T> cls) {
    if(cls.isEnum()) { // is redundant when the compiler checks this.
        @SuppressWarnings("unchecked")
        Class<T> enumClass = (Class<T>) cls;
        T val = Enum.valueOf(enumClass, "NAME1");
        return val;
    }
    return null;
}

然而,调用这个方法也是一场噩梦。;)

票数 7
EN

Stack Overflow用户

发布于 2011-03-11 05:45:23

使用raw类型是很好的。虽然Java不愿意添加原始类型,但它已经被证明是必要的和不可或缺的,超越了向后兼容性问题。

没有原始类型,要以理论上完美的方式解决问题,Java必须变得更加复杂。它可能需要一个类型变量变量。在这一点上,代码不再是为了取悦人类,它是为了取悦机器。(考虑到所有无法理解的泛型代码,我们可能已经到了这一步)

票数 1
EN

Stack Overflow用户

发布于 2012-02-27 05:31:07

代码语言:javascript
复制
    class EnumValues<P extends Enum<P>>
    {
        public static <P extends Enum<P>> P [] getValues( Class<P> keyType)
        {
            return keyType.getEnumConstants();
        }
    }

用法:

代码语言:javascript
复制
    Class cls = Thread.State.class;
    for( Enum en : EnumValues.getValues( cls)) 
        System.out.println( en.name()); 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5262096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档