我有一个有以下签名的课程:
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()
正在返回类ArticleDortField
,但setSelectedCriteria
方法的参数类型为Enum
,这就是反射返回null
的原因
此外,如果我将MultipleSorting
的签名更改为public class MultipleSorting<T>
,则T
的{{1}}将变为setSelectedCriteria
。
Object
将被T
取代。但无法理解为什么它表现得像这样。类型擦除的工作原理是什么?他们是否用具体实现替换泛型类型?任何指针对我都非常有用。
答案 0 :(得分:2)
您的问题的一个可能的解决方法可能是通过调用具有所需类型的Method
,然后使用其超类型来查找“setSelectedCriteria”getClass().getDeclaredMethod(...)
,然后沿着类层次结构向上走,直到找到匹配方法。这不是一个非常漂亮的解决方案,但它可能会成功。
是的,这是由类型擦除引起的。编译代码后,没有<T>
,只有Object
,没有<T extends Enum<?>>
,只有Enum
。类型安全性是由编译器检查的,但不是由JVM强制执行的。