Java泛型-ArrayList初始化

众所周知,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?extended 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分配给a

List<Integer>,则保证将被破坏。

分配List<Integer>到例如类型的基准List<?>List<? extends

Number>是合法的,因为?装置(其中的类型是“给定的类型的一些未知的子类型”

Object中的只是的情况下?Number在的情况下? extends Number)。

由于?表明您 不知道List将接受哪种特定类型的对象,因此只能null向其中添加任何内容。但是,允许您从其中 检索

任何对象,这是使用有? extends X界通配符类型的目的。请注意,对于有? super X界通配符类型而言,情况恰恰相反……a List<?

super

Integer>是“某种未知类型的列表,至少是其超类型Integer”。虽然你不知道到底是什么类型List是(可能是List<Integer>List<Number>List<Object>)你肯定知道不管它是什么,一个Integer可以被添加到它。

最后,这new ArrayList<?>()是不合法的,因为在创建参数化的类(如)的实例时ArrayList,您必须提供 特定的

类型参数。您可以在示例中使用任何内容(ObjectFoo都不要紧),因为您将无法直接添加任何内容null,因为您直接将其分配给了ArrayList<?>引用。

以上是 Java泛型-ArrayList初始化 的全部内容, 来源链接: utcz.com/qa/397729.html

回到顶部