麻烦通用列表并添加包装器

时间:2010-08-13 20:19:31

标签: java generics collections

我承认我在使用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正常工作,我仍然可以从构造函数中设置任务列表?

2 个答案:

答案 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;