- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 Java 泛型如何处理继承/多态性有点困惑。
假设以下层次结构 -
动物(父级)
狗 - 猫( child )
假设我有一个方法 doSomething(List<Animal> animals)
。根据继承和多态性的所有规则,我假设 List<Dog>
是 List<Animal>
和一个 List<Cat>
是 List<Animal>
- 所以任何一个都可以传递给这个方法。并非如此。如果我想实现这种行为,我必须明确告诉该方法接受 Animal 的任何子类的列表,方法是 doSomething(List<? extends Animal> animals)
。
我明白这是Java的行为。我的问题是为什么?为什么多态性一般是隐式的,但是当涉及到泛型时就必须指定它?
最佳答案
不,一个List<Dog>
是不是 List<Animal>
。考虑一下您可以用List<Animal>
做什么- 您可以向其中添加任何动物...包括猫。现在,你能合乎逻辑地将一只猫添加到一窝小狗中吗?绝对不是。
// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?
突然间,你有了一只非常困惑的猫。
现在,您无法添加 Cat
到 List<? extends Animal>
因为你不知道这是一个List<Cat>
。您可以检索一个值并知道它将是 Animal
,但不能添加任意动物。 List<? super Animal>
则相反。 - 在这种情况下,您可以添加 Animal
安全地访问它,但您不知道可以从中检索什么,因为它可能是 List<Object>
.
关于java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081428/
object a = new Dog(); 对比 Dog a = new Dog(); 在这两种情况下,a.GetType() 都会给出 Dog。两者都调用相同的构造函数(具有相同的层次结构)。 那你
如何将此 css 应用于移动元素文本“DOG DOG DOG”以覆盖 cat 图像? 我用chrome测试没问题 http://image.ohozaa.com/i/g53/BwHNe9.png 但在
为什么 && 运算符返回最后一个值(如果语句为真)? ("Dog" == ("Cat" || "Dog")) // false ("Dog" == (false || "Dog")) // true
这个问题已经有答案了: Can we omit parentheses when creating an object using the "new" operator? (6 个回答) 已关闭 9
mongodb Dog.find() 在 Dog.create() 之前执行 我只是遇到了一些我无法理解的问题以及为什么会发生。我刚刚开始通过在线教程学习 mongodb。我在 cloud9 练习我的
我不太确定为什么较大字符串(“cat”和“dog”)的答案不一致。我正在用链接列表和模板的使用做一些事情。我的好奇心促使我修改模板和函数重载。如果有人能解释发生了什么,我将不胜感激。谢谢你。 #inc
我有一个奇怪的异常,我不知道为什么。我在内存中有数据库中的列表,但是当我尝试访问 getter 或将实体保存在变量中时,它会引发异常。 这是实体: package model; import java
当我“打印”(狗)的大小时 char dog[1000];// i get size of 1000 char *dog = (char*)malloc(1000 * sizeof(char));//
我有一个类Animal , 及其子类 Dog .我有一个 List我想添加一些 List 的内容到 List .有没有比只投 List 更好的方法呢?到 List , 然后使用 AddRange ?
我在 Twitter 上找到了以下代码片段(查看帖子历史以获取来源)。 [5] pry(main)> Date.parse('3 Dogs') ArgumentError: invalid date
Dog是一个用于DNS查询的命令行工具,它的工作原理类似于dig。它具有丰富多彩的输出,支持DNS-over-TLS 和 DNS-over-HTTPS协议,并且可以输出JSON格式。 系统环境
我希望此代码使用 jQuery 更改 3 个 div 的类 maximum。 $(".cat, .dog").click(function() { var el = $(this);
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我正在尝试实现原始论文中的方法(Enhanced LocalTextureFeatureSetsforFace在困难光照条件下的识别,作者:Xiaoyang Tan 和 Bill Triggs)在 p
我正在阅读名为“Code Complete”的书。书中对“dog-tag field”有解释。 Use dog-tag fields to check for corrupted memory. A
我自己找不到问题!感谢您的帮助,当我将空结构传递给 getPets() 这是一个接口(interface)接收器时,我期待结构返回的空引用,但我得到了这个错误 **dog 没有实现宠物(说话的类型错误
代码是自动生成的,所以我无法通过添加 HTML 来添加类/id 等,所以我尝试使用 js 来执行此操作。我 chop 了内容,但基本上我想将类“dog1”添加到与 Dog 1 相关的行,将类“dog2
我在nodejs中创建了一个基本项目,但是当我提交数据时,它说无法发布api/dogs。 https://vfs.cloud9.us-east-2.amazonaws.com/vfs/3199fe30
如果 Dog 继承自 Animal。 我有一个动物 [],我碰巧知道它只包含狗。接触 Dog[] 的最快/最好方法是什么?我用过 new ArrayList(oldarray).ToArray(typ
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 已关闭6年。
我是一名优秀的程序员,十分优秀!