gpt4 book ai didi

java - 列表泛型协方差

转载 作者:行者123 更新时间:2023-12-01 07:06:46 25 4
gpt4 key购买 nike

假设我们有 2 个不同的列表。

列表 1 可以采用任何 Number 参数(包括 int、double、float 以及所有其他 Number 子类)。

 List<Number> l1 = new ArrayList();

所以这样做效果很好。

    l1.add(123);
l1.add(123.3456);

列表 2 扩展了 Number。问题是我无法向其中添加任何内容,而且我不明白为什么。另外,为什么我需要一个 < 的列表? extends Something > 而不是仅仅创建一个可以存储任何子类的层次结构中最高类的列表(如列表 1)?

List<? extends Number> l2 = new ArrayList();
l2.add(123); //Error, although Integer is a subclass of Number
l2.add(new Integer(123)); // Wrappers don't work either
l2.add(123.456); //Error again

最佳答案

调用add等方法的问题其类上有一个通用参数 ? extends通配符是编译器不知道确切的类型。它可能是 List<Number>List<Integer>List<Double>List<BigInteger> 。编译器必须保护泛型的类型安全,如果允许这样的调用,则类型安全将不会被保留。不应允许您添加 Double到一个列表,可能是 List<Integer> .

这样? extends上限通配符本身可用作方法参数,其中确切类型并不重要;重要的是它是界限(在本例中为 Number )或更低。

public void foo(List<? extends Number> list) {
for (Number n : list) {
// do something with some kind of Number, don't care which

关于java - 列表泛型协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177770/

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