list 类型现在是是List<? extends Vehicle>,你可以将其读作“具有任何从Vehicle继承的类型的列表”,但是这实际上并不意味着这个List将持有任何类型的Vehicle。通配符引用的是明确的类型,因此他意味着“某种Vehicle引用没有指定的具体类型”。因此,这个被赋值的List必须持有诸如CarA CarB这样的某种指定类型,但是为了向上转Vehicle,这个类型是什么,并没有人关心。
如果唯一的限制是这个List要持有某种具体的Vehicle类或者子类,但是你实际上并不关心他是什么。那么你能用这样的List做什么呢?如果不知道List持有什么类型,那么你怎样才能安全的向其中添加对象呢?
虽然编译器允许你 ArrayList<CarA> list_2 = new ArrayList<CarA>(); 一旦执行这种类型的向上转型,你就将丢失掉向其中传递任何对象的能力,甚至是传递Object也不行。 |