tl; dr Использование Collections#unmodifiableList
:
List<IData> outputList = Collections.unmodifiableList(aList);
Для получения дополнительной информации по этой теме вы можете ознакомиться с Принцип PECS .
Это невозможно, поскольку эти два типа несовместимы.
A List<BaseClass>
- это именно то, что объявлено, список BaseClass
объектов,Точнее, он дает две гарантии:
- объекты, извлеченные из него, могут быть назначены на
BaseClass
- каждый объект, который может быть назначен на
BaseClass
, может быть добавлен к нему (и нетдругое)
A List<? extends BaseClass>
- более свободная декларация.Точно, это просто не дает второй гарантии.Однако гарантия не только исчезла, но и теперь невозможно добавить в нее элементы, поскольку точный общий тип списка не определен.Он может даже измениться для того же объявления списка (но не для того же объекта списка) во время выполнения.
Как следствие, List<? extends BaseClass>
нельзя назначить для List<BaseClass>
, так как последний дает гарантию первомуне может выполнить.
На практике рассмотрим следующий метод:
public List<BaseClass> makeList() {
// TODO implement method
return null;
}
Если кто-то реализует этот метод, возвращая List<? extends BaseClass>
, клиент, использующий этот метод, будетневозможно добавить элементы к нему, хотя в его объявлении указано иное.
Из-за этого такое присваивание приводит к ошибке компиляции.
Чтобы исправить примерную проблему, к ней может быть добавлено свободное объявление.метод:
public List<? extends BaseClass> makeList() {
// TODO implement method
return null;
}
Это будет сигнализировать каждому клиенту, что список, возвращаемый этим методом, не предназначен для добавления элементов в него.
Теперь давайте вернемся к вашему использованиюдело.На мой взгляд, наиболее подходящее исправление - перефразировать функцию, которая
берет [s] List из списка aList.
Как кажется, в настоящее время она объявленакак
public void useList(List<BaseClass> list);
, но поскольку он не добавляет элементы в список, он должен быть объявлен как
public void useList(List<? extends BaseClass> list);
Однако, если этот метод является частью неизменяемого в настоящее время API, вы можетееще делаю:
List<? extends BaseClass> list;
....
List<BaseClass> tmp = Collections.unmodifiableList(list);
useList(tmp);