对象类型列表和扩展类型的对象列表之间的区别[重复]
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<Animal>
可以包含Cat
s 和Dog
s。您可以将猫和狗添加到列表中。这并不意味着它只能包含Animal
s。
但是如果你有一个方法foo(List<Animal> foo)
,你不能传递一个List<Cat>
给它。但是您可以在传递的List<Animal>
中添加Cat
s、Dog
s 或Animal
s。
如果您有foo(List<? extends Animal> foo)
,您可以将List<Animal>
、List<Dog>
和List<Cat>
传递给它并从中读取,即您可以访问Animal
s 方法。
但是由于Animal
的任何子类型列表都可以传递给它(你不知道是哪种类型,它可能是Animal
、Cat
或Dog
,或者一些完全不同的@ 987654342@,您不能向其中添加任何元素(null
除外)。
【讨论】:
是任意限制吗?我会假设foo(List<Animal> foo)
会接受 List<Cat>
因为猫是动物
见***.com/questions/2745265/…
所以基本上,答案是 Java 的泛型以一种非常违反直觉的方式工作。
另外,我找到了duplicate。以上是关于对象类型列表和扩展类型的对象列表之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章