Если вы посмотрите на код map
и выполните все вызовы методов, вы увидите, что option.map(list -> list)
в итоге возвращает new Optional<>(option.get())
. Таким образом, вы можете заменить свое последнее назначение на:
Optional<ArrayList<?>> works = new Optional<>(option.get());
Это создает новый Optional<ArrayList<?>>
и инициализирует его переменную экземпляра value
(тип ArrayList<?>
) с ArrayList<String>
, возвращаемым map.get()
. Это действительное назначение.
Есть ли какое-то неявное приведение в действие?
Нет, map
возвращает новый экземпляр Optional
. Он не использует исходный экземпляр, для которого он был вызван.
Вот цепочка вызовов методов:
option.map(list -> list)
возвращает (поскольку option
не пусто)
Optional.ofNullable(mapper.apply(value))
, что в вашем случае совпадает с
Optional.ofNullable(value)
, который возвращает (поскольку значение не равно нулю):
Optional.of(value)
, который возвращает
new Optional<>(value)