对象类型列表和扩展类型的对象列表之间的区别[重复]

Posted

技术标签:

【中文标题】对象类型列表和扩展类型的对象列表之间的区别[重复]【英文标题】:Difference between a list of object types and a list of objects extending a type [duplicate] 【发布时间】:2017-02-26 22:11:12 【问题描述】:

我经常遇到这样的情况:

List<Fooable> fooList;

List<? extends Fooable> fooList;

这两者有什么区别?或者是否有描述这种差异的这个/预先存在的链接的名称?我无法在 Google 上搜索这个概念,因为我不知道它叫什么,也不知道你会如何描述它。

Fooable 是否是一个接口有关系吗?一个具体的类?一个抽象类?这是否仅适用于扩展和/或实现某些东西的类?

【问题讨论】:

我相信这里已经回答了。 ***.com/questions/4343202/… 或者在这里。 programmers.stackexchange.com/questions/303584/… 至于该构造的名称,称为“上界通配符”,例如见docs.oracle.com/javase/tutorial/java/generics/upperBounded.html 实际上,Programmers SO 上的链接问题似乎是重复的。 这不是Java链接所说的吗? the former matches a list of type Number only 【参考方案1】:

如果没有重复的话……

List&lt;Animal&gt;可以包含Cats 和Dogs。您可以将猫和狗添加到列表中。这并不意味着它只能包含Animals。

但是如果你有一个方法foo(List&lt;Animal&gt; foo),你不能传递一个List&lt;Cat&gt;给它。但是您可以在传递的List&lt;Animal&gt; 中添加Cats、Dogs 或Animals。

如果您有foo(List&lt;? extends Animal&gt; foo),您可以将List&lt;Animal&gt;List&lt;Dog&gt;List&lt;Cat&gt; 传递给它并从中读取,即您可以访问Animals 方法。

但是由于Animal 的任何子类型列表都可以传递给它(你不知道是哪种类型,它可能是AnimalCatDog,或者一些完全不同的@ 987654342@,您不能向其中添加任何元素(null 除外)。

【讨论】:

是任意限制吗?我会假设 foo(List&lt;Animal&gt; foo) 会接受 List&lt;Cat&gt; 因为猫是动物 见***.com/questions/2745265/… 所以基本上,答案是 Java 的泛型以一种非常违反直觉的方式工作。 另外,我找到了duplicate。

以上是关于对象类型列表和扩展类型的对象列表之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python字典和列表区别都有哪些

数组和集合的区别?

python列表(list)+索引切片+修改+插入+删除+range函数生成整数列表对象

使用公共属性联合两个不同类型的列表[重复]

Python的列表和元组的区别

组合数据类型,英文词频统计