Контравариантность stream в Java 8

208
02 апреля 2018, 23:55

Который раз спотыкаюсь на стримы и интерфейсы в Java. Допустим у меня есть интерфейс ToDeString и класс De, который его имплементит. Этот класс имеет метод List<De> getList(), который возвращает объекты этого же класса De. Затем, я создаю такой стим:

de.getList().stream().map(d->d.getList().stream()).map(s-> streamToDeString(s))

Где String streamToDeString(Stream<ToDeString> stream). Но так нельзя. Функция streamToDeString не принимает стримы типа Stream<De>, хотя De наследует ToDeString.

Разъясните, пожалуйста, что я делаю не так.

Answer 1

Конечно так нельзя ) И ни в одном нормальном языке так нельзя )

Чтобы это работало, вам эту ковариантность нужно явно указать:

String streamToDeString(Stream<? extends ToDeString> stream)

Вы наверное путаете это с такой формой:

String func(ToDeString arg) - Тогда действительно можно предеавать и наследников тоже.

Собственно само понятие ковариантности позволяет указать что List из наследников тоже будет наследником. Как то так.

READ ALSO
Обработать Infinity при делении на ноль java

Обработать Infinity при делении на ноль java

Подскажите где ошибка? Не получается обработать деление на ноль

334
JavaFx, Зум &ldquo;рисунка&rdquo; в canvas

JavaFx, Зум “рисунка” в canvas

Есть такой код для canvas, что бы при прокрутке колесиком мышки, можно было увеличивать или уменьшать содержание canvasНо есть одно но, при увеличении...

270
Java проблема парсинга даты

Java проблема парсинга даты

Решаю задачу парсинга вакансий с сайта HeadeHunter при помощи jsoup и пытаюсь парсить дату, но получаю ошибку:

292
проблемы с реализацией LinkedList [требует правки]

проблемы с реализацией LinkedList [требует правки]

Нужно получить значение 3 в результате выполнения следующего кода: Systemout

185