我已经定义了以下类
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
定义的类型有任何相关性?
答案 0 :(得分:3)
当您使用原始类型时,编译器确实会删除所有泛型类型,包括与类参数类型相关的类型(在您的情况下为E
),以及那些不在(T
中的类型情况)。
所以当你没有参与你的扩展程序时,即使你的T
被删除(这是一个动词吗?)到Object
,这也解释了错误。
可以从Non-generic reference to generic class results in non-generic return types
找到好的参考资料答案 1 :(得分:0)
您的AbstractManager类声明包含一个泛型参数,但是在扩展该类时,您使用的是原始类型, 试试
public class MatchingAlgorithmManagerImpl extends AbstractManager<Country>