繁体   English   中英

狗是动物,但清单 <Dog> 没有列出 <Animal> 。 如何在泛型/多态函数中安全使用它?

[英]Dog is Animal but list<Dog> is not list<Animal>. How to use it safely in a generic/polymorphic function?

众所周知, DogAnimalList<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM