假设我有一个通用类型P
,它是一个枚举,即<P extends Enum<P>>
,我想从字符串中获取Enum值,例如:
String foo = "foo";
P fooEnum = Enum.valueOf(P.class, foo);
这将导致编译错误,因为P.class
无效。那么我能做些什么来使上面的代码工作呢?
答案 0 :(得分:4)
您必须在某处拥有此泛型类型的运行时实例,以便您可以通过Enum#getDeclaringClass()
获取声明类。假设您已将P p
声明为某个方法参数,这是一个示例。
E.g。
public static <P extends Enum<P>> P valueOf(P p, String name) {
return Enum.valueOf(p.getDeclaringClass(), name);
}
答案 1 :(得分:3)
Java无法实现。通用类型已擦除并在字节代码中转换为Object
。泛型类型(在您的情况下为“P”)不是真正的类,而只是占位符。
请查看this question,并在类型擦除方面找到很好的答案。
答案 2 :(得分:1)
Java使用称为类型擦除的东西来实现泛型。这意味着实际的通用参数在运行时被擦除。因此,您无法从泛型类型参数推断出类型信息。
答案 3 :(得分:0)
您可以通过让调用者或某个配置提供程序在运行时获取它。例如,您可以使用Spring或其他任何配置。
class Converter<P extends Enum> {
private Class<P> type;
//setter and getter
public P valueOf(String name) {
return Enum.valueOf(type, name);
}
}
然后在任何需要的地方配置它。