我有一个具有以下签名的类(class):
public class MultipleSorting<T extends Enum<?>> {
private Class<T> criteriaType;
private T selectedCriteria;
public MultipleSorting(Class<T> criteriaType) {
super();
this.criteriaType = criteriaType;
}
public void setSelectedCriteria(T selectedCriteria) {
this.selectedCriteria = selectedCriteria;
}
public T getSelectedCriteria() {
return selectedCriteria;
}
public Class<T> getCriteriaType(){
return criteriaType;
}
public void setCriteriaType(Class<T> criteriaType){
this.criteriaType = criteriaType;
}
}
我将其实例化为 new MultipleSorting(ArticleSortField.class);
。这里ArticleSortField
是 Enum
。现在通过 MultipleSorting
中的另一种方法当我尝试获取方法 setSelectedCriteria
时通过反射为:
Method setSelectedCriteriaMethod = getClass().getDeclaredMethod("setSelectedCriteria",getCriteriaType());
setSelectedCriteriaMethod
正在返回null
。经过调试我发现getCriteriaType()
正在返回类(class) ArticleDortField
但 setSelectedCriteria
的参数类型方法是Enum
,这就是反射返回 null
的原因.
此外,如果我更改 MultipleSorting
的签名如public class MultipleSorting<T>
然后T
的setSelectedCriteria
正在成为Object
.
- 如何解决该问题?
- 这是由于类型删除而发生的吗?我以为
T
将被ArticleDortField
取代。但无法理解为什么它会这样。类型删除究竟是如何工作的?他们是否用具体实现替换了泛型类型?
任何指针都会对我非常有帮助。
最佳答案
解决您的问题的可能方法是查找“setSelectedCriteria”Method
通过调用 getClass().getDeclaredMethod(...)
使用所需的类型,然后使用其父类(super class)型,并沿着类层次结构向上移动,直到找到匹配的方法。这不是一个非常漂亮的解决方案,但它可能会起作用。
是的,这是由类型删除引起的。一旦你的代码被编译,就没有 <T>
但只是Object
,没有<T extends Enum<?>>
但只是Enum
。类型安全是由编译器检查的,但不是由 JVM 强制执行的。
关于java - 带有参数化类的泛型类型的反射查找方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17781785/