您不能分配列表< Number>到List< Integer>类型的引用因为List< Number>允许除Integer之外的数字类型.如果您被允许这样做,则允许以下内容:
List numbers = new ArrayList();
numbers.add(1.1); // add a double
List ints = numbers;
Integer fail = ints.get(0); // ClassCastException!
类型List< Integer>正在保证它包含的任何内容将是一个整数.这就是为什么你被允许从其中获得一个整数,而不是投射.如您所见,如果编译器允许将另一类型的列表(例如Number)分配给List< Integer>那个保证会被打破.
分配列表引用一个类型,例如List或列表扩展号>是合法的吗?意思是“给定类型的某些未知子类型”(在“?”的情况下,类型为“Object”,“Number”).
既然?表示您不知道List将接受什么特定类型的对象,添加任何东西但不为null是合法的.但是,您是否允许从其中检索任何对象,这是使用的目的?扩展X有界通配符类型.请注意,相反的是一个?超X有界通配符类型…一个列表超级整数>是“至少是整型的超类型的一些未知类型的列表”.虽然您不知道确切地知道什么类型的列表(可以是List< Integer>,List< Number>,List< Object>),但您可以确定,无论它是什么,都可以添加一个整数.
最后,新的ArrayList()不合法,因为当您创建像ArrayList这样的参数化类的实例时,必须给出一个特定的类型参数.你可以真正使用你的例子中的任何东西(Object,Foo,没关系),因为你直接将它分配给一个ArrayList参考.