Neal Gafter 引入了类型标记(例如Class<String>
)。假设在运行时可以访问 的实例Class<String>
,是否可以在运行时检索泛型类型 ( String
)?
我正在寻找类似于Method.getGenericReturnType()的东西。
我认为只有字段/方法才有可能。由于类型擦除,我们无法在运行时获取特定于类的泛型类型。如果您可以上课,似乎可以做一些黑客攻击。阅读此讨论。
与 C# 不同,泛型在 Java 中不存在于运行时。因此,您不能尝试创建泛型类型的实例或尝试在运行时查找泛型类型的类型。
听起来你想要的是ParameterizedType
.
您可以通过反射 aClass
和来自它的对象 ( Method
, Field
) 来获得这些。但是,您无法ParameterizedType
从任何旧Class
对象中获取 a;Class
您可以从表示扩展泛型类或接口的类型的实例中获取一个。
可以使用 Bob Lee 对 Gafter 的 Gadget 模式的一种变体:
public class GenericTypeReference<T> {
private final Type type;
protected GenericTypeReference() {
Type superclass = getClass().getGenericSuperclass();
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
}
public Type getType() {
return this.type;
}
public static void main(String[] args) {
// This is necessary to create a Class<String> instance
GenericTypeReference<Class<String>> tr =
new GenericTypeReference<Class<String>>() {};
// Retrieving the Class<String> instance
Type c = tr.getType();
System.out.println(c);
System.out.println(getGenericType(c));
}
public static Type getGenericType(Type c) {
return ((ParameterizedType) c).getActualTypeArguments()[0];
}
}
上面的代码打印:
java.lang.Class<java.lang.String>
class java.lang.String