Который раз спотыкаюсь на стримы и интерфейсы в 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.
Разъясните, пожалуйста, что я делаю не так.
Конечно так нельзя ) И ни в одном нормальном языке так нельзя )
Чтобы это работало, вам эту ковариантность нужно явно указать:
String streamToDeString(Stream<? extends ToDeString> stream)
Вы наверное путаете это с такой формой:
String func(ToDeString arg) - Тогда действительно можно предеавать и наследников тоже.
Собственно само понятие ковариантности позволяет указать что List из наследников тоже будет наследником. Как то так.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей