我承认我在使用Java Generics方面没有太多经验。
现在,我正在使用Generics改进一些旧代码,以减少/简化现在已经离开公司的同事编写的现有代码。
基本上,我正在处理的系统有6种请求类型:1种常规,5种特定的继承自General。每种请求类型都有关联的任务类型。
这是我遇到麻烦的代码:
public class GeneralRequest implements Serializable {
protected List<? extends GeneralTask> taskList;
public <E extends GeneralTask> boolean addTask(E newTask) {
boolean returnvalue = false;
if(!this.taskList.contains(newTask)){
returnvalue = taskList.add(newTask);
}
return returnvalue;
}
}
public class AnnexationRequest extends GeneralRequest implements Serializable {
public AnnexationRequest(List<AnnexationTask> tal) {
this.taskList = tal;
}
}
问题出在GeneralRequest的添加行中。正如目前所写,taskList.add
行炸弹与
The method add(capture#6-of ? extends GeneralTask) in the type List<capture#6-of ? extends GeneralTask> is not applicable for the arguments (E)
现在,如果我将taskList声明更改为
protected List<? super GeneralTask> taskList;
它解决了这个问题,但是子类给了我一个不同的错误,例如AnnexationRequest
:
Type mismatch: cannot convert from List<AnnexationTask> to List<? super GeneralTask>
如何修复它以便addTask正常工作,我仍然可以从构造函数中设置任务列表?
答案 0 :(得分:4)
public class GeneralRequest<E extends GeneralTask> implements Serializable {
private final List<E> taskList;
protected GeneralRequest(List<E> taskList) {
this.taskList = taskList;
}
public boolean addTask(E newTask) {
if(this.taskList.contains(newTask))
return false;
taskList.add(newTask);
return true;
}
}
public class AnnexationRequest extends GeneralRequest<AnnexationTask> {
public AnnexationRequest(List<AnnexationTask> tal) {
super(tal);
}
}
答案 1 :(得分:1)
您不能将任何元素(null
除外)放入Collection<?>
。
但是,您可以使用
protected List<GeneralTask> taskList;