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