假设我有一个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,在前面的例子中)
答案 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来测试类对象之间的可分配性
我希望这有帮助,祝你好运!