gpt4 book ai didi

java - Java中的通配符问题

转载 作者:行者123 更新时间:2023-12-01 17:35:51 25 4
gpt4 key购买 nike

给定以下类

class Creature {}
class Animal extends Creature {}
class Dog extends Animal {}

以及以下列表

List<? super Animal> l1;
List<? extends Animal> l2;

以下哪个命令会导致编译错误?

1) l1.add(new Dog())
2) l1.add(null)
3) Object a = l1.get(0)
4) l2.add(new Dog())
5) Creature c = l2.get(0))

我认为是四个,因为? extends Animal 不一定是 Dog 的父类(super class)型,但我不完全确定。解释一下会有很大帮助:)

最佳答案

super 和扩展

线路List<? super Animal> l1;表示列表 l1可以实例化以保存Animal父类(super class)型的对象。示例:l1 = new LinkedList<Creature>();

线路List<? extends Animal> l2;表示列表 l2可以实例化以保存Animal子类型的对象。示例:l2 = new LinkedList<Dog>();

答案

假设列表已构建。

1) 列表l1可以实例化以保存 Animal 的任何父类(super class)型。自 DogAnimal 的任何父类(super class)型的子类型它可以隐式转换。编译。

2) 始终编译。 List的规范不否认空值。运行时异常取决于列表实现是否允许空元素。 LinkedList 允许空值。

3) 隐式转换为父类(super class)型(每个对象都是类 Object 的实例)始终编译。如果列表为空,则会在运行时引发异常。

4) add List<? extends Animal> l2 的方法签名是 l2.Add(? extends Animal) 。当我们调用l2.Add(new Dog())时编译器无法确定类型 ?Dog 的父类(super class)型(因为它不知道 ? 是什么,因为我们使用 List 接口(interface)显式调用该方法,而不是通过 List 的实现),因此它一定会导致编译错误。

来自评论:“但请注意,这个问题与引用容器时使用接口(interface)无关。当 ArrayList 被引用时,也会发生相同的编译错误。在声明中使用而不是 lList。” ——德克

5) 假设多余的括号是一个错误。隐式转换为父类(super class)型始终进行编译。 Creature是列表中任何内容的父类(super class)型 l2能把持住。如果列表为空,则会在运行时引发异常。

关于java - Java中的通配符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6483417/

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