以编程方式评估类层次结构中类型变量之间的关系

时间:2015-01-20 17:27:01

标签: java reflection

假设我有一个Java类层次结构,定义如下:

interface Bar<T> {}

class Foo<A,B> implements Bar<B> {}

如何以编程方式评估(使用反射)Foo中Bar的类型参数是foo参数的第二个而不是第一个(B而不是A)?

我已尝试使用TypeVariable#getName()来比较名称,但当我将getGenericInterfaces()应用于Foo<A,B>时,我得到Bar<T>而不是Bar<B> < / p>

解决方案(感谢@LouisWasserman):使用Foo.class.getGeenricInterfaces()[0] .getActualTypeParameters()返回正确的TypeVariable(B代替T,在前面的例子中)

1 个答案:

答案 0 :(得分:0)

好好使用TypeVariable#getName()返回在您的情况下源代码中显示的类型,获取Bar<T>是正常的。 TypeVariable Doc

由于Type Erasure,在泛型类中使用反射无法提供帮助。 Erasure of Generic Types

我在一些个人项目中遇到同样的问题,我试图改变我班级的设计,看看下面的例子:

而不是:

public class Mapper<T> {

   public Mapper(){
   }
}

我用过这个:

public class Mapper {
   private Class<?> entityClazz;
   public Mapper(Class<?> entity){
       this.entityClazz = entity
       //Here I've donne all reflection issues i want ! 
   }
}

您可以使用Class#isAssignableFrom() Doc来测试类对象之间的可分配性 我希望这有帮助,祝你好运!