gpt4 book ai didi

java - 了解通配符约束

转载 作者:行者123 更新时间:2023-12-02 01:33:44 24 4
gpt4 key购买 nike

我可以使用基本的通用表达式,但通配符约束只会扰乱我的思维。

信息:学生扩展了人,人扩展了动物

 List<? super Animal> aList= new ArrayList<>();

// does not compile as expected,
// since the list is restricted to something that has Animal as superclass.
// aList.add(new Object());

aList.add(new Animal()); // I can add animal
aList.add(new Person()); // I can add Person
aList.add(new Student()); // I can add Student

Animal a = new Animal();
Animal b = new Animal();
Person p = new Person();
Student s = new Student();
// test
a = b; //I can assign an animal to another animal
a = p; // I can assign a person to an animal
a = s; // I can assign a student to an animal

Animal animal = aList.get(0); // DOES NOT COMPILE, WHY ?

问题:我不明白为什么最后的作业不起作用。上面的例子表明,该列表中的任何东西都绝对是动物,但我无法从该列表中获取动物。

更具体:当我知道我只能添加以 Animal 作为父类(super class)的类型时,为什么我不能期望从 Animal 类型中删除对象?

事实:我只能添加扩展 Animal 的对象!我只是尝试添加一个汽车对象,但它不起作用!

我开始怀疑自己的理智了,希望你能帮助我。谢谢您

另外:

Object animal = aList.get(0); // works

即使我知道无法添加对象类型,为什么此语句仍然有效?

解决方案:(基于接受的答案)

我误解了<? super Animal>的含义

我认为它的含义:任何以 Animal 作为父类(super class)的类。

它(显然)的含义:任何动物父类(super class)的类。

因此,List 也可能包含 Object 类型的对象,这就是 Animal animal = aList.get(0); 的原因。失败。

干杯

最佳答案

这里的其他答案是正确的,但表述得不够清楚,这就是困惑的来源。

一个List<? extends Animal> 不是的意思是“所有扩展 Animal 的事物的列表”。它的意思是“某种类型的列表 T ,我不会告诉你它是什么,但我知道 T 扩展了 Animal 。” (在类型论中,这些被称为存在类型——存在一个类型 T ,我们的 ListList<T> ,但我们不一定知道 T 是什么.)

差异很重要。如果您有“所有扩展 Animal 的事物的列表”,那么将 Dog 添加到列表中是安全的 - 但这不是通配符表达的内容。一个List<? extends Animal>意思是“某事物的列表,该事物扩展了动物”。它可能是 List<Animal> ,或 List<Dog> ,或 List<Cat> ——我们不知道。所以我们没有理由认为将狗添加到该列表中是安全的 - 因为也许我的列表是 List<Cat>

在您的示例中,您有 List<? super Animal> 。这意味着某种类型 T 的列表,其中 T 是 Animal 的父类(super class)型之一。它可能是 List<Object> ,或 List<Animal> ,或者如果 Animal 有一个父类(super class)型 HasLegs,它可能是 List<HasLegs> 。在这里,将狗放入这个列表中是安全的 - 因为无论它的列表是什么,狗绝对是其中之一(动物,物体等),但是当您取出某些东西 在列表中,你不知道它是狗、动物还是只是一个物体。

关于java - 了解通配符约束 <? super T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31032578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com