Я не знаю, почему этот код не компилируется (случай 1)Кастинг с потоком API
List list = new LinkedList<>();
List<Long> longList = list.stream()
.map(value -> (Long) ((Map) value).get("id"))
.collect(Collectors.toList());
но этот код успешно скомпилируется (случай 2)
List list = new LinkedList<>();
Stream<Long> longStream = list.stream()
.map(value -> (Long) ((Map) value).get("id"));
List<Long> longList = longStream.collect(Collectors.toList());
и этот код компиляции успешно (случай 3)
List<Object> list = new LinkedList<>();
List<Long> longList = list.stream()
.map(value -> (Long) ((Map) value).get("id"))
.collect(Collectors.toList());
Мой коллега предположить, что это связано с
Замените все параметры типа в общих типах своими границами или
Object
, если параметры типа являются неограниченными. Таким образом, полученный байт-код содержит только обычные классы, интерфейсы и методы.
Таким образом, в случае 1 список не ограничен, поэтому компилятор заменит все типы с Object
.
В случае 2 мы создаем общий Stream
из Long
, и этот поток не может быть неограниченным. Компилятор ничего не делает.
В случае 3 у нас есть List
из Object
и нет замены во время компиляции.
Вопрос в том, какая реальная разница между этими тремя случаями?
смешивания сырья типы дженериков никогда не является хорошей идеей ... – assylias
я знаю, но это не моя идея. Hibernate criteria.list() возвращает исходный тип в некоторых случаях, и я ищу «лучший» код для сопоставления и сбора данных с помощью stream api. –