本文总结:java泛型是无法获取到T.class。
1 问题引入
在定义泛型类时,想要获取到泛型类的类型变量对应的class,这样就可以根据class通过newInstance来创建对象。所以现在问题就是如何在下面代码中初始化tClass:
1 2 3 4 5 6 7 8 9 |
public class PrintClass<T> { private Class<T> tClass; public Class<T> getTClass() { return tClass; } public PrintClass() { // TODO 如何初始化tClass } } |
我们第一反映应该是在构造函数中使用,但是会发钱编译器报错。
1 2 3 |
public PrintClass(){ this.tClass = T.class; } |
总结,在对于java泛型是无法拿到T.class。
2 一个例子
只有定义一个子类(SonPrintClass)来继承具体的模板类(FatcherClass<String,Integer>)时,此时才能在SonPrintClass获取到T和V具体的class。
1. 将模板类定义为父类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class FatcherClass<T,V> { private Class<T> tClass; private Class<V> vClass; public Class<T> getTClass (){ return tClass; } public Class<V> getVClass (){ return vClass; } public FatcherClass() { tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; vClass = (Class<V>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1]; } } |
在上面代码中最重要的就是
1 |
tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; |
解释如下
(1)getGenericSuperclass()
用来获取带有泛型的父类。这个函数返回的结果的类型是Type
(2)ParameterizedType
用来获取java泛型参数类型。如通过ParameterizedType#getActualypeArguments()[i]来获取。
2. 如何使用,通过一个子类来继承具体的FatherClass
1 2 3 |
public class SonPrintClass extends FatcherClass<String,Integer> { } |
3. 测试
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args) { SonPrintClass printClass = new SonPrintClass(); System.out.println(printClass.getTClass()); System.out.println(printClass.getVClass()); } } |
执行结果为:
class java.lang.String
class java.lang.Integer
(全文完)