Java Generics - 将子类列表分配给超类列表

use*_*280 5 java generics

我有一个关于将子类列表分配给超类列表的基本问题.

所以我有以下内容:

Class B extends A;

List <B> bList = new ArrayList<B>();
List <A> aList = bList; 
Run Code Online (Sandbox Code Playgroud)

为什么最后一次分配失败?对不起新手问题

Vin*_*lds 9

声明类型A的项目列表时,只能在列表中添加或删除类型A的项目.如果需要包含A的子类,请使用通用通配符? extends A来表示.因此,您的代码应该是:

List <? extends A> aList = bList; 
Run Code Online (Sandbox Code Playgroud)


Sai*_*Sai 9

为了解释这一点,让我用"整数"替换"B",用"数字"替换"A".这只是为了让它更容易解释.

Class Integer extends Number;

List <Integer> iList = new ArrayList<Integer>();
List <Number> nList = iList // will fail
Run Code Online (Sandbox Code Playgroud)

这会失败的原因是因为nList可以取任何数字 - 它可以取整数,它可以取Double,或者就此而言任何Number的子类.但是,对于iList,情况并非如此.您不能将Double添加到iList,因为它只接受Integer及其子类.希望这有助于向您解释.