狗是动物,但列表<Dog>不是列表<Animal>。如何在泛型/多态函数中安全地使用它?

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

本文关键字:gt 列表 lt 安全 多态 函数 泛型 Dog Animal      更新时间:2023-10-16

众所周知,DogAnimalList<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>也是如此。