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

时间:2014-11-18 20:05:26

标签: java c++ polymorphism

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

可以吗? 还有其他选择吗?

感谢。

1 个答案:

答案 0 :(得分:2)

  

该功能[...]不会修改该列表。怎么走?

在Java中,声明类型为List<? extends Animal>的参数。这提供了一个以List泛型参数的Animal类型参数为界的通配符。您可以将其视为扩展Animal 的任何未知类型的列表。它是未知类型这一事实意味着,只有List类型参数T的值所需的唯一类型才能使用null类型,其唯一值为null

List<Dog>是符合该说明的类型,因此是List<Cat>