[英]Dog is Animal but list<Dog> is not list<Animal>. How to use it safely in a generic/polymorphic function?
众所周知, Dog
是Animal
但List<Dog>
不是List<Animal>
(因此, 问题 )
无论如何,如果我们有一个功能
void f(Animal a1, Animal a2); // Java
void f(Animal * a1, Animal * a2) // C++
我们可以安全地使用f()传入Dog / Dog*
类型的对象
现在假设,我们想通过使用它们的List
来概括它,使其具有许多Animal类型的参数(而不是专门针对多参数列表...)。 该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>)
这可以吗?
还有其他选择吗?
谢谢。
该列表将不会通过功能[...]进行修改。 怎么走?
在Java中,声明类型为List<? extends Animal>
的参数List<? extends Animal>
List<? extends Animal>
。 这提供了以Animal类型参数为界的通配符,该通配符与List
通用参数有关。 您可以将其作为扩展Animal
的任何未知类型的列表来阅读。 这是一个未知类型这一事实意味着,无论何时期望List
的类型参数T
的值都可以使用的唯一类型是null类型,其唯一值为null
。
List<Dog>
是适合该描述的类型, List<Cat>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.