2

Neal Gafter 引入了类型标记(例如Class<String>)。假设在运行时可以访问 的实例Class<String>,是否可以在运行时检索泛型类型 ( String)?

我正在寻找类似于Method.getGenericReturnType()的东西。

4

4 回答 4

2

我认为只有字段/方法才有可能。由于类型擦除,我们无法在运行时获取特定于类的泛型类型。如果您可以上课,似乎可以做一些黑客攻击。阅读此讨论

于 2012-07-30T18:17:09.880 回答
1

与 C# 不同,泛型在 Java 中不存在于运行时。因此,您不能尝试创建泛型类型的实例或尝试在运行时查找泛型类型的类型。

于 2012-07-30T18:20:56.270 回答
1

听起来你想要的是ParameterizedType.

您可以通过反射 aClass和来自它的对象 ( Method, Field) 来获得这些。但是,您无法ParameterizedType从任何旧Class对象中获取 a;Class您可以从表示扩展泛型类或接口的类型的实例中获取一个。

于 2012-07-30T21:02:13.380 回答
0

可以使用 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 
于 2012-07-30T21:35:31.150 回答