1

我有一个带有以下签名的课程:

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. 但不明白为什么它会这样。类型擦除究竟是如何工作的?他们是否用具体实现替换了泛型类型?

任何指针都会对我很有帮助。

4

1 回答 1

2

解决您的问题的一个可能方法是查找“setSelectedCriteria” ,方法是使用所需的类型Method调用getClass().getDeclaredMethod(...),然后使用其超类型调用,然后向上遍历类层次结构,直到找到匹配的方法。这不是一个非常漂亮的解决方案,但它可能会奏效。

是的,这是由类型擦除引起的。一旦你的代码被编译,就没有<T>了,只有Object,没有了<T extends Enum<?>>,只有Enum。类型安全是由编译器检查的,但不是由 JVM 强制执行的。

于 2013-07-22T07:18:04.360 回答