[英]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.