泛型类型参数

时间:2011-04-05 21:15:33

标签: java generics

我已经定义了以下类

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定义的类型有任何相关性?

2 个答案:

答案 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>