gpt4 book ai didi

java - 泛型的类型安全

转载 作者:搜寻专家 更新时间:2023-11-01 03:31:41 26 4
gpt4 key购买 nike

我有一堆简单的接口(interface):

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);

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

关于java - 泛型的类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50757383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com