gpt4 book ai didi

java - 可迭代< ?扩展 iface_class >

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:31:10 26 4
gpt4 key购买 nike

我是 Java 新手。谁能告诉我这行是什么意思?

class_A
...
Iterable< ? extends iface_classB> getThings();

这里 iface_classB 可以是 classB 的接口(interface)/抽象。

当我写一些东西时出现错误:

class_A myA = new classA()

Iterable< impl_of_iface_classB > anIterator = myA.getThings()

我想知道模板中的问号。我的猜测是它应该是派生自 iface_classB 的任何东西,但看来我错了。

非常感谢您的回答。

最佳答案

您所做的假设与实际情况相反:

Iterable<? extends iface_classB> getThings();

表示getThings()返回具有至少 iface_classB 功能的对象的可迭代对象.因此,您不能分配 getThings() 的结果到任何 Iterable< impl_of_iface_classB >因为您只确定对象公开了 iface_classB 的功能.

例如,如果 getThings() 返回的对象会怎样?实际上是一个 Iterable<impl2_of_iface_classB> , 其中impl2_of_iface_classB延伸iface_classB ?可迭代对象将没有 impl_of_iface_classB 的功能对象。

在实践中,如果B1B2源自 B , 完全允许有

A<? extends B> x; 
A<B1> y;
A<B2> z;

x = y;
x = z;

因此 getThings()就通用参数代表什么而言不能依赖:它只能作为“普通”使用 iface_classB .

更重要的是,您希望能够分配给 Iterable<iface_classB> ,但你不能(除非你执行未经检查的强制转换,否则不能)。这是因为通配符本质上意味着“一组可行的通用参数”。想象一下,您将通配符替换为您使用的具体泛型参数:如果参数不匹配,由于类型不兼容,您会遇到常见的编译时错误。编译器必须考虑所有情况,不允许您这样做。因此,

A<? extends B> x;
A<B> y = x;

虽然有效安全,但不允许因为 x可以分配一个不同于 B 的参数,为分配的两侧产生不同的类型。相反,

A<B> x;
A<? extends B> y = x;

是允许的,因为 y 的类型表示一组备选方案,该组包括A<B> .一旦y如上赋值,实际选择集合的具体赋值。

关于java - 可迭代< ?扩展 iface_class >,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10878322/

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