相关疑难解决方法(0)

List <Dog>是List <Animal>的子类吗?为什么Java泛型不是隐式多态的?

我对Java泛型如何处理继承/多态性感到困惑.

假设以下层次结构 -

动物(父母)

- (儿童)

所以假设我有一个方法doSomething(List<Animal> animals).根据所有继承和多态的规则,我会假设a List<Dog> a List<Animal>而a List<Cat> a List<Animal>- 所以任何一个都可以传递给这个方法.不是这样.如果我想实现这种行为,我必须明确告诉该方法接受一个Animal的任何子类的列表doSomething(List<? extends Animal> animals).

我知道这是Java的行为.我的问题是为什么?为什么多态通常是隐含的,但是当涉及泛型时必须指定它?

java generics polymorphism inheritance

727
推荐指数
10
解决办法
10万
查看次数

泛型:列表<?extends Animal>和List <Animal>相同?

我只是想了解extendsJava Generics中的关键字.

List<? extends Animal>意味着我们可以在任何东西对象List是阿 Animal

那么以下也不会意味着同样的事情:

List<Animal>
Run Code Online (Sandbox Code Playgroud)

有人能帮助我了解上述两者之间的区别吗?对我来说extends这里听起来多余.

谢谢!

java generics extends covariance contravariance

45
推荐指数
3
解决办法
3万
查看次数

任何简单的方法来解释为什么我不能做List <Animal> animals = new ArrayList <Dog>()?

我知道为什么不应该这样做.但有没有办法向外行人解释为什么这是不可能的.你可以轻松地向外行解释:Animal animal = new Dog();.狗是一种动物,但是一系列的狗并不是动物的清单.

java oop generics covariance

22
推荐指数
5
解决办法
5063
查看次数

C# - 当Dog是Animal的子类时,如何将List <Dog>转换为List <Animal>?

我有一个类Animal及其子类Dog.我有一个List<Animal>,我想添加一些内容List<Dog>List<Animal>.有没有更好的方法来做到这一点,而不仅仅是将其转换List<Dog>为a List<Animal>,然后使用AddRange

c# polymorphism list

11
推荐指数
2
解决办法
6656
查看次数