对象类型列表和扩展类型的对象列表之间的区别
Difference between a list of object types and a list of objects extending a type
我经常遇到这样的情况:
List<Fooable> fooList;
对
List<? extends Fooable> fooList;
这两者有什么区别?或者是否有这个/预先存在的名称 link 描述了这种差异?我不能 Google 这个概念,因为我不知道它叫什么,也不知道你怎么描述它。
Fooable 是一个接口重要吗?具体的class?摘要class?这是否仅适用于 class 扩展 and/or 实现的东西?
好吧,如果没有重复...
一个List<Animal>
可以包含Cat
和Dog
。您可以将猫狗添加到列表中。不代表只能包含Animal
s.
但是如果你有一个方法foo(List<Animal> foo)
,你不能传递一个List<Cat>
给它。但是您可以将 Cat
s、Dog
s 或 Animal
s 添加到传递的 List<Animal>
。
如果你有一个foo(List<? extends Animal> foo)
,你可以传递一个List<Animal>
、List<Dog>
和List<Cat>
给它并从中读取,即你可以访问Animal
s 方法。
但是由于 Animal
的任何子类型列表都可能传递给它(您不知道是哪种类型,它可能是 Animal
、Cat
或 Dog
,或者一些完全不同的Animal
,你不能向它添加任何元素(除了null
)。
我经常遇到这样的情况:
List<Fooable> fooList;
对
List<? extends Fooable> fooList;
这两者有什么区别?或者是否有这个/预先存在的名称 link 描述了这种差异?我不能 Google 这个概念,因为我不知道它叫什么,也不知道你怎么描述它。
Fooable 是一个接口重要吗?具体的class?摘要class?这是否仅适用于 class 扩展 and/or 实现的东西?
好吧,如果没有重复...
一个List<Animal>
可以包含Cat
和Dog
。您可以将猫狗添加到列表中。不代表只能包含Animal
s.
但是如果你有一个方法foo(List<Animal> foo)
,你不能传递一个List<Cat>
给它。但是您可以将 Cat
s、Dog
s 或 Animal
s 添加到传递的 List<Animal>
。
如果你有一个foo(List<? extends Animal> foo)
,你可以传递一个List<Animal>
、List<Dog>
和List<Cat>
给它并从中读取,即你可以访问Animal
s 方法。
但是由于 Animal
的任何子类型列表都可能传递给它(您不知道是哪种类型,它可能是 Animal
、Cat
或 Dog
,或者一些完全不同的Animal
,你不能向它添加任何元素(除了null
)。