java – 使用泛型键入安全性

我有一堆简单的接口:

interface County extends Line{}

interface Country<C extends Line> extends LineContainer<C> {}

interface Line {}

interface LineContainer <L extends Line> {
    public List<L> getLines();
}

和服务方法

public static <L extends Line,C extends LineContainer<L>> C getContainer( Class<C> containerType, Class<L> lineType ){
    ...somthing...

调用服务方法

Country<County> c = getContainer( Country.class, County.class );

面对没有错误,但检查员说:

Type safety: The expression of type Country needs unchecked conversion to conform to Country

我不明白:
通过使用County作为L-LineType调用服务方法,C是L的容器,C由Country作为C-Type,因此,我期望类型推断将得出结论,将提供Country对象.

任何人都可以解释,为什么我错了,我是否以及如何实现我想要的目标?

背景:这个想法是 – 作为服务的用户 – 我可以根据需要自由组合容器和线路(只要服务提供商可以提供服务)

最佳答案 这是因为编译器不确定Country.class是否与签名Country< County>匹配. Country.class被视为原始类型.

如果你这样写:

public static <L extends Line, C extends LineContainer<L>> C getContainer(C container, Class<L> lineType) {
    return null;
}

和:

Country<County> c = getContainer(new Country<County>() {
    @Override
    public List<County> getLines() {
        return null;
    }
}, County.class);

显然这是行得通的.

现在假设我将相同的代码分成另一种方式:

    Country foo = new Country<County>() {
        @Override
        public List<County> getLines() {
            return null;
        }
    };
    Country<County> c = getContainer(foo, County.class);

由于原始类型,这将在编译时再次发出警告.

点赞