我定义了以下类
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>