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,您必须提供 特定的
类型参数。您可以在示例中使用任何内容(Object,Foo都不要紧),因为您将无法直接添加任何内容null,因为您直接将其分配给了ArrayList<?>引用。
以上是 Java泛型-ArrayList初始化 的全部内容, 来源链接: utcz.com/qa/397729.html
