gpt4 book ai didi

java - 为什么我们不能使用扩展边界添加java泛型中的元素?

转载 作者:行者123 更新时间:2023-12-02 02:40:18 25 4
gpt4 key购买 nike

我知道我们无法在列表中添加扩展边界类型的元素。但我仍然不确定为什么java编译器不允许这样做。因为编译器可以很容易地检查添加的新元素是否是泛型类型的子类型。谁能帮我解决这个问题吗?

最佳答案

这种情况称为协方差,extends 关键字允许您从Collection 读取元素,但不能添加它们。这是因为编译器将 add 操作视为不安全。例如,您可以声明以下任何列表:

List<? extends Number> myNums = new ArrayList<Integer>(); 
List<? extends Number> myNums = new ArrayList<Float>();
List<? extends Number> myNums = new ArrayList<Double>();

您可以毫无问题地读取它们,因为列表中包含的任何内容都可以向上转换为 Number。但是,您不能将任何内容放入其中:

myNums.add(45L); //compiler error

这是由于编译器无法确定泛型列表的实际类型(可能是 IntegerFloat在我们的示例中为 Double)。因此,这是一个不安全的操作,您可能会将 Long 添加到 Integer 列表中,因此编译器不允许您这样做。

阅读this文章进行更深入的解释。

关于java - 为什么我们不能使用扩展边界添加java泛型中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45609642/

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