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