您不能
List<Number>为类型的引用分配,
List<Integer>因为它
List<Number>允许使用除以外的数字类型
Integer。如果允许您这样做,则将允许以下操作:
List<Number> numbers = new ArrayList<Number>();numbers.add(1.1); // add a doubleList<Integer> ints = numbers;Integer fail = ints.get(0); // ClassCastException!
该类型
List<Integer>可以保证它包含的任何内容都是
Integer。这就是为什么您
Integer无需铸造就可以退出的原因。如您所见,如果编译器允许将
List另一种类型的
Number分配给a
List<Integer>,则保证将被破坏。
分配
List<Integer>到例如类型的基准
List<?>或
List<? extendsNumber>是合法的,因为
?装置(其中的类型是“给定的类型的一些未知的子类型”
Object中的只是的情况下
?和
Number在的情况下
? extends Number)。
由于
?表明您 不知道
List将接受哪种特定类型的对象,因此只能
null向其中添加任何内容。但是,允许您从其中 检索
任何对象,这是使用有
? extends X界通配符类型的目的。请注意,对于有
? super X界通配符类型而言,情况恰恰相反……a
List<?superInteger>是“某种未知类型的列表,至少是其超类型
Integer”。虽然你不知道到底是什么类型
List是(可能是
List<Integer>,
List<Number>,
List<Object>)你肯定知道不管它是什么,一个
Integer可以被添加到它。
最后,这
new ArrayList<?>()是不合法的,因为在创建参数化的类(如)的实例时
ArrayList,您必须提供 特定的
类型参数。您可以在示例中使用任何内容(
Object,
Foo都不要紧),因为您将无法直接添加任何内容
null,因为您直接将其分配给了
ArrayList<?>引用。



