Сбор с использованием задачи типизирования Generics для реализации и интерфейса - PullRequest
1 голос
/ 27 июля 2011

Дано:

interface ViewableDTO {//methods here}

class PersonDTO implements ViewableDTO {//implementation here}

Это отлично работает:

PersonDTO p = new PersonDTO();
ViewableDTO v = p; //works

Почему это не работает:

List<PersonDTO> plist = getPersonDtoList();
List<ViewableDTO> vlist = plist; //compilation error
List<ViewableDTO> vlist = (List<ViewableDTO>)plist; //compilation error

Мое решение здесь заключается в следующем:

List<ViewableDTO> vlist = new ArrayList<ViewableDTO>();
vlist.addAll(plist);

У меня вопрос, это единственный / лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Подумайте, что вы можете сделать с List<ViewableDTO>.Вы можете добавить любой объект типа, реализующего ViewableDTO.Вы действительно хотите, чтобы это компилировалось?

List<PersonDTO> plist = getPersonDtoList();
List<ViewableDTO> vlist = plist;
vlist.add(new OtherDTO());

?

Нет - только безопасно получить 1010 * список из списка в этой форме, так что вы используете что-тонапример:

List<PersonDTO> plist = getPersonDtoList();
List<? extends ViewableDTO> vlist = plist;

См. раздел часто задаваемых вопросов об универсальных Java-компонентах по подстановочным знакам для получения дополнительной информации.

0 голосов
/ 27 июля 2011

Это будет работать

List<? extends ViewableDTO> vlist = plist;

Пожалуйста, посмотрите на Что такое PECS (производитель расширяет потребительские супер)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...