Neal Gafter介绍type tokens(例如Class<String>
)。假设有人在运行时可以访问Class<String>
的实例,是否可以在运行时检索泛型类型(String
)?
我正在寻找与Method.getGenericReturnType()类似的东西。
答案 0 :(得分:2)
我认为只有字段/方法才有可能。由于类型擦除,我们无法在运行时获取类特定的泛型类型。如果你有权上课,你可以做一些黑客攻击。阅读此discussion。
答案 1 :(得分:1)
与C#不同,Generics在Java中不存在于运行时。因此,您无法尝试创建泛型类型的实例或尝试在运行时查找泛型类型。
答案 2 :(得分:1)
听起来你想要的是ParameterizedType
。
您可以通过反映Class
和来自它的对象(Method
,Field
)来获得这些内容。但是,您无法从任何旧ParameterizedType
对象获取Class
;您可以从表示扩展泛型类或接口的类型的Class
实例中获取一个。
答案 3 :(得分:0)
有可能使用Bob Lee对Gafter小工具模式的详细描述:
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