泛型类型参数



我定义了以下类

public class AbstractManager<E> {
    public E save(E o) {
        // Implementation omitted
    }
    public <T> T getSingleResult(Query query, Class<T> clazz) {
        return clazz.cast(query.getSingleResult());
    }
}
public class MatchingAlgorithmManagerImpl extends AbstractManager {
    void someMethod() {
        // compiler error: "Type mismatch: cannot convert from Object to Country"
        Country c = this.getSingleResult(query, Country.class);
    }
}

我对为什么我得到这个编译器错误感到非常困惑,当然它应该使用Country作为<T>的值,而它似乎使用Object,我认为这是<E>的默认值,当我不指定参数类型。

更奇怪的是,如果我将子类定义更改为public class MatchingAlgorithmManagerImpl extends AbstractManager<Object>,错误就消失了。

为什么我为E定义的类型有任何相关性?

当您使用原始类型时,编译器确实会删除所有泛型,包括那些与类参数类型相关的类型(在您的情况下为E),以及那些与类参数类型无关的类型(在您的情况下为T)。

所以当你没有参数化你的扩展,甚至你的T被擦除(这是一个动词吗?)为Object,这解释了错误。

可以从非泛型引用到非泛型返回类型的泛型类结果中找到好的引用

AbstractManager的类声明包含一个泛型参数,但是当您扩展该类时,您使用的是原始类型,试着

public class MatchingAlgorithmManagerImpl extends AbstractManager<Country>

最新更新