我正在尝试做以下几件事:
Class<?> cls = unknownClass;
if(cls.isEnum()){
@SuppressWarnings("unchecked")
Class<? extends Enum<?>> enumClass = (Class<? extends Enum<?>>) cls;
Object val = Enum.valueOf(enumClass, "NAME1");
}
但我得到以下错误:
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>>
谁能告诉我我哪里做错了?
发布于 2011-03-10 23:53:23
问题是你有两个?
,它们可能是不同的,但它们必须是相同的。
要么必须使用非泛型类型,要么像这样声明泛型类型
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;
}
然而,调用这个方法也是一场噩梦。;)
发布于 2011-03-11 05:45:23
使用raw类型是很好的。虽然Java不愿意添加原始类型,但它已经被证明是必要的和不可或缺的,超越了向后兼容性问题。
没有原始类型,要以理论上完美的方式解决问题,Java必须变得更加复杂。它可能需要一个类型变量变量。在这一点上,代码不再是为了取悦人类,它是为了取悦机器。(考虑到所有无法理解的泛型代码,我们可能已经到了这一步)
发布于 2012-02-27 05:31:07
class EnumValues<P extends Enum<P>>
{
public static <P extends Enum<P>> P [] getValues( Class<P> keyType)
{
return keyType.getEnumConstants();
}
}
用法:
Class cls = Thread.State.class;
for( Enum en : EnumValues.getValues( cls))
System.out.println( en.name());
https://stackoverflow.com/questions/5262096
复制相似问题