[英]How to find the class object of Java generic type?
假设我有一个通用类型P
,它是一个Enum,即<P extends Enum<P>>
,我想从字符串中获取Enum值,例如:
String foo = "foo";
P fooEnum = Enum.valueOf(P.class, foo);
这将导致编译错误,因为P.class
无效。 那么,为了使上述代码有效,我该怎么办?
您必须在某处具有此泛型类型的运行时实例,以便您可以通过Enum#getDeclaringClass()
获取声明类。 假设你已经将P p
声明为某个方法参数,这是一个例子。
例如
public static <P extends Enum<P>> P valueOf(P p, String name) {
return Enum.valueOf(p.getDeclaringClass(), name);
}
Java中没有办法。 擦除通用类型并将其转换为字节代码中的Object
。 泛型类型(在您的情况下为“P”)不是真正的类,而只是占位符。
有关类型擦除的好答案,请查看此问题 。
Java使用称为类型擦除的东西来实现泛型。 这意味着实际的通用参数在运行时被擦除。 因此,您无法从泛型类型参数中推断出类型信息。
您可以通过让调用者或某个配置提供程序在运行时获取它。 例如,您可以使用Spring或其他任何配置。
class Converter<P extends Enum> {
private Class<P> type;
//setter and getter
public P valueOf(String name) {
return Enum.valueOf(type, name);
}
}
然后在需要的地方配置它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.