簡體   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