繁体   English   中英

为什么列出 <? extends Foo> 不接受Foo类的对象?

[英]Why does the List<? extends Foo> not accept an object of the Foo class?

我试图将Foo类的对象添加到List<? extends Foo> List<? extends Foo> ,但是代码无法编译。

final Foo[] array = new Foo[] {new Foo()};
final List<? extends Foo> list = new ArrayList<>(array.length);
for (final Foo foo : array)
{
     // The List<? extends Foo> does not accept the foo object.
     list.add(foo);
}

这里又是一个问题:为什么会这样呢? 那没有任何意义,是吗? 我只想要一个List ,它可以包含扩展Foo类的对象。

我认为您误会了什么List<? extends Event> List<? extends Event>实际上是 这并不意味着“我可以将Event任何子类添加到此列表中”。 这就是List<Event>含义,因为子类可以转换为Event List<? extends Event> List<? extends Event>说:“有一些Event子类限制了这种类型”。 因此,如果foo类型为List<? extends Event> List<? extends Event> ,则foo可能是List<Event> ,但也可能是List<SomeSpecificTypeOfEvent> ,在这种情况下,不允许您添加 SomeSpecificTypeOfEvent的内容。 我认为您想要的只是List<Event> ; 通配符在这里是多余的,因此没有必要。

有关方差注释的更多阅读( extendssuper ): https ://en.wikipedia.org/wiki/Covariance_and_contravariance_( computer_science)

编辑 :正如约翰内斯·库恩(Johannes Kuhn)在评论中指出的那样,如果您要做的只是将元素添加到列表中,那么您可以拥有的最一般的类型不是List<Event>而是List<? super Event> List<? super Event> ,因为您可以通过任何Event超类型的列表,并且您的方法仍然可以正常工作。 必须小心,因为使用? super Event ? super Event可能会导致稍后尝试访问列表元素的某些问题,但是如果您在方法中所做的所有工作都写入列表,那么它会完美地工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM