众所周知,Dog
是Animal
但List<Dog>
不是List<Animal>
(SO question)
无论如何,如果我们有一个功能
void f(Animal a1, Animal a2); // Java
void f(Animal * a1, Animal * a2) // C++
我们可以安全地使用f()传递Dog / Dog*
现在假设,我们想把它概括为好像它有很多类型为Animal的参数
通过使用它们的List
(而不是具体的多参数列表......)。
List
不会被函数修改,
例如,将Cat
添加到List<Dog>
。
此:
void fg (List<Animal>); // Java
void fg (List<Animal *>) // C++
不允许呼叫传递List<Dog> / List<Dog*>
值。
要走的路是什么?
可能是Java
void fg (List<? extends Animal>)
和C ++
template<T>
void fg (List<T>)
可以吗? 还有其他选择吗?
感谢。
答案 0 :(得分:2)
该功能[...]不会修改该列表。怎么走?
在Java中,声明类型为List<? extends Animal>
的参数。这提供了一个以List
泛型参数的Animal类型参数为界的通配符。您可以将其视为扩展Animal
的任何未知类型的列表。它是未知类型这一事实意味着,只有List
类型参数T
的值所需的唯一类型才能使用null类型,其唯一值为null
。
List<Dog>
是符合该说明的类型,因此是List<Cat>
。