众所周知,Dog
是Animal
但List<Dog>
不是List<Animal>
(所以问题)
无论如何,如果我们有一个函数
void f(Animal a1, Animal a2); // Java
void f(Animal * a1, Animal * a2) // C++
我们可以安全地在类型 Dog / Dog*
的对象中使用 f() 传递
现在假设,我们想概括它,就好像它有许多 Animal 类型的参数一样通过使用其中的List
(而不是特定的多参数列表......函数不会修改List
,例如,向List<Dog>
添加Cat
。
这:
void fg (List<Animal>); // Java
void fg (List<Animal *>) // C++
不允许传入List<Dog> / List<Dog*>
值的调用。
要走的路是什么?
可能在爪哇
void fg (List<? extends Animal>)
并在C++
template<T>
void fg (List<T>)
可以吗?
还有其他选择吗?
谢谢。
该列表不会被函数 [...] 修改。要走的路是什么?
在 Java 中,声明一个类型为 List<? extends Animal>
的参数。这为List
泛型参数提供了一个由 Animal 类型参数限定的通配符。您可以将其读取为扩展Animal
的任何未知类型的列表。它是未知类型的事实意味着,在需要List
的类型参数T
值的地方,唯一可以使用的类型是 null 类型,其唯一值是 null
。
List<Dog>
是符合该描述的类型,List<Cat>
也是如此。