获取参数化类参数的类型?

时间:2010-06-13 18:12:16

标签: java generics reflection

我有以下课程

public class MyClass<T> {
    public Class<T> getDomainClass() {
          GET THE CLASS OF T
    }
}

我已经搜索了这个问题,我找到的所有答案都告诉我使用getGenericSuperClass(),但这个方法的问题是我必须有第二个类扩展MyClass而我不想这样做。我需要的是获得具体类的参数化类型?

5 个答案:

答案 0 :(得分:5)

你做不到。由于类型擦除,所需的信息(即T的值)在运行时不可用。

答案 1 :(得分:3)

由于类型擦除,获取它的唯一方法是将它作为显式参数传递 - 无论是在方法中还是在构造函数中。

public class MyClass<T> {
    public Class<T> getDomainClass(Class<T> theClass) {
          // use theClass
    }
}

答案 2 :(得分:3)

我知道的唯一方法:

public class MyClass<T> {

    private Class<T> clazz;

    public MyClass(Class<T> clazz) {
       this.clazz = clazz;
    }

    public Class<T> getDomainClass() {
      return clazz;
    }
}

因此,您基本上为运行时提供信息,而不是编译器。

答案 3 :(得分:1)

如果你想获得你继承的泛型类型,你可以这样做!将此方法添加到您的课程并获利! ;)

public Class<?> getGenericType() {
    Class result = null;
    Type type = this.getClass().getGenericSuperclass();

    if (type instanceof ParameterizedType) {
        ParameterizedType pt = (ParameterizedType) type;
        Type[] fieldArgTypes = pt.getActualTypeArguments();
        result = (Class) fieldArgTypes[0];
    }

    return result;
}

答案 4 :(得分:0)

如果你需要知道类型,你可能不应该使用泛型。