Java Iterable<?扩展iface_类>;

Java Iterable<?扩展iface_类>;,java,Java,我是Java新手。有人能告诉我这句话是什么意思吗 class_A ... Iterable< ? extends iface_classB> getThings(); A类 ... IterablegetThings(); 其中,iface_classB可以是此处classB的接口/抽象 当我写下以下内容时,出现了错误: class_A myA = new classA() Iterable< impl_of_iface_classB > anIterator =

我是Java新手。有人能告诉我这句话是什么意思吗

class_A
...
Iterable< ? extends iface_classB> getThings();
A类
...
Iterable<?扩展iface_classB>getThings();
其中,iface_classB可以是此处classB的接口/抽象

当我写下以下内容时,出现了错误:

class_A myA = new classA()

Iterable< impl_of_iface_classB > anIterator = myA.getThings()
class_A myA=new classA()
IterableanIterator=myA.getThings()
我想知道模板中的问号。我的猜测是,它应该是从
iface\u classB
派生的任何东西,但似乎我错了


非常感谢您的回答。

这是泛型的一部分,它与通配符有关
检查此链接

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

Iterable<? extends iface_classB> getThings();
因此,
getThings()
不能依赖于泛型参数的含义:它只能作为“普通”的
iface\u classB
使用

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

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

是允许的,因为
y
的类型表示一组备选方案,该组包括
a
。一旦像上面那样分配了
y
,就实际选择了集合的具体估值。

请显示错误。还要确保不要混淆迭代器和Iterable。从您正在展示的内容来看,它应该可以工作。eclipse在这一行标记为有问题。我也不了解迭代器…因为我是Java新手。我的书没有涵盖这些新的Java标准。Iterable和迭代器类之间有什么不同?有人能给我一个答案的链接或者给我一个简短的解释吗?当你在公共场合提问时,你应该遵守命名惯例。
A<? extends B> x;
A<B> y = x;
A<B> x;
A<? extends B> y = x;