gpt4 book ai didi

Java 泛型 - ArrayList 初始化

转载 作者:IT老高 更新时间:2023-10-28 20:53:18 26 4
gpt4 key购买 nike

众所周知,arraylist init。应该是这样的

ArrayList<A> a = new ArrayList<A>();
ArrayList<Integer> a = new ArrayList<Number>(); // compile-time error

那么,为什么 java 允许这些?

1. ArrayList<? extends Object> a1 = new ArrayList<Object>();
2. ArrayList<?> a2 = new ArrayList<Integer>();

那么,如果它们是正确的,为什么不允许这些?

1. a1.add(3);
2. a2.add(3);

编译器消息是:ArrayList 类型中的方法 add(int, capture#1-of ? extends Object) 不适用于参数 (int)

更一般的

  1. a1.add(null e);
2. a2.add(? e);

我读到了这个,但很高兴收到你的来信。谢谢

另一个有趣的地方是:

 ArrayList<ArrayList<?>> a = new ArrayList<ArrayList<?>>(); // correct
ArrayList<?> a = new ArrayList<?>(); // wrong. I know it's reason but I have some
question in my mind that mentioned above

最佳答案

您不能分配 List<Number>指向 List<Integer> 类型的引用因为List<Number>允许 Integer 以外的数字类型.如果您被允许这样做,则允许执行以下操作:

List<Number> numbers = new ArrayList<Number>();
numbers.add(1.1); // add a double
List<Integer> ints = numbers;
Integer fail = ints.get(0); // ClassCastException!

类型List<Integer>保证它包含的任何内容都是 Integer .这就是为什么你可以得到 Integer没有类型转换就可以了。如您所见,如果编译器允许 List其他类型,例如 Number分配给 List<Integer>该保证将被打破。

分配 List<Integer>指向类型的引用,例如 List<?>List<? extends Number>是合法的,因为 ?表示“给定类型的某些未知子类型”(其中类型为 Object? 的情况下和 Number? extends Number 的情况下)。

自从 ?表示您不知道 List 是什么具体类型的对象会接受,添加 null 以外的任何内容都是不合法的给它。但是,您可以从中检索任何对象,这是使用 ? extends X 的目的。有界通配符类型。请注意,? super X 的情况正好相反。有界通配符类型... a List<? super Integer>是“一些未知类型的列表,至少是 Integer 的父类(super class)型”。虽然您不知道 List 的确切类型它是(可能是 List<Integer>List<Number>List<Object> )你肯定知道它是一个 Integer可以添加进去。

最后,new ArrayList<?>()是不合法的,因为当您创建像 ArrayList 这样的参数化类的实例时,你必须给出一个特定的类型参数。你真的可以在你的例子中使用任何东西( ObjectFoo ,没关系),因为除了 null 之外你永远无法添加任何东西因为您将其直接分配给 ArrayList<?>引用。

关于Java 泛型 - ArrayList 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4492950/

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