是否可以在运行时检索用于类型标记的泛型类型(即Class <t>)?</t>

时间:2012-07-30 18:15:53

标签: java class generics types

Neal Gafter介绍type tokens(例如Class<String>)。假设有人在运行时可以访问Class<String>的实例,是否可以在运行时检索泛型类型(String)?

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

听起来你想要的是ParameterizedType

您可以通过反映Class和来自它的对象(MethodField)来获得这些内容。但是,您无法从任何旧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