[英]Why is Foo<String> considered a subtype (extended) of Foo<? extends Object>?
[英]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>
; 通配符在这里是多余的,因此没有必要。
有关方差注释的更多阅读( extends
和super
): 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.