2010-08-13 5 views
2

Я признаю, что у меня нет большого опыта использования Java Generics.Проблема с общим списком и добавлением обертки

Прямо сейчас, я обновляю старый код с помощью Generics, чтобы уменьшить/упростить существующий код, написанный коллегой, который с тех пор покинул компанию.

В принципе, система, в которой я работаю, имеет 6 типов запросов: 1 общий и 5 конкретных, которые наследуются от генерала. Каждый тип запроса связан с типами задач.

Вот код, где у меня неприятности:

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 работает должным образом, и я все еще могу установить список задач из конструктора?

ответ

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); 
    } 
} 
+0

Ах, я не думал поставить тип задачи как класс родовым. Упс. – Powerlord

1

Вы не можете поместить любой элемент (кроме null) в Collection<?>.

Однако, вы можете использовать

protected List<GeneralTask> taskList; 
+0

Да, но я использую 'protected List ', который разрешает« GeneralTask ​​»и определяет, какой подкласс в различных конструкторах класса запроса. – Powerlord

Смежные вопросы