我有一个带有以下签名的课程:
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
as的签名,public class MultipleSorting<T>
则T
ofsetSelectedCriteria
正在变为Object
.
- 我该如何解决这个问题?
- 这是由于类型擦除而发生的吗?我以为
T
会被ArticleDortField
. 但不明白为什么它会这样。类型擦除究竟是如何工作的?他们是否用具体实现替换了泛型类型?
任何指针都会对我很有帮助。