Java中如何创建类继承列表?泛型列表编译错误排查求助
首先咱们直接戳中问题核心:你用了List<? extends Exception>这种通配符声明,而Java编译器不允许往这种类型的列表中添加除了null之外的任何元素,这就是编译报错的根源。
具体原因解析
List<? extends Exception>的含义是:这个列表是某个继承自Exception的子类的列表,但具体是哪个子类,编译器无法确定。虽然你把它赋值成了ArrayList<BaseIRPMException>,但编译器在处理exceptions.add(...)时,只会参考变量的声明类型List<? extends Exception>,不会去追踪实际的实例类型。
举个例子理解:假设BaseException并不是BaseIRPMException的子类,那你把BaseException实例塞进一个实际存储BaseIRPMException的列表里,必然会导致类型不匹配。编译器要在编译阶段就阻止这种潜在的不安全操作,所以干脆直接禁止所有非null的添加行为。
针对性解决方法
根据你的实际需求,有几种修正方向:
直接使用具体子类类型
如果你确定这个列表就是用来存储BaseIRPMException及其子类的,直接声明为具体类型即可(前提是BaseException是BaseIRPMException的子类):List<BaseIRPMException> exceptions = new ArrayList<>(); exceptions.add(new BaseException("Some text "));使用下界通配符
<? super T>
如果你需要添加BaseException及其子类的实例,可以用下界通配符,表示列表可以存储BaseException或者它的父类:List<? super BaseException> exceptions = new ArrayList<Exception>(); exceptions.add(new BaseException("Some text "));直接用顶层父类类型
如果你只需要存储任意Exception类型的实例,直接声明为List<Exception>最省心:List<Exception> exceptions = new ArrayList<>(); exceptions.add(new BaseException("Some text "));
内容的提问来源于stack exchange,提问作者SimonNechypurenko

