Я тестирую Java 8 Optional
класс:
static Optional<Integer> test() {
return Optional.of(1).map(i -> Optional.of(i.toString()).map(j -> Integer.valueOf(j)));
}
По моей мысли, функция должна возвращать необязательный объект Integer 1. Однако компилятор Java 8 недоволен:
Test.java:5: error: incompatible types: inference variable U has incompatible bounds
return Optional.of(1).map(i -> Optional.of(i.toString()).map(j -> Integer.valueOf(j)));
^
equality constraints: Integer
lower bounds: Optional<U>
where U,T are type-variables:
U extends Object declared in method <U>map(Function<? super T,? extends U>)
T extends Object declared in class Optional
Почему компилятор не доволен?
Подпись Optional
.map()
говорит, что Function
заданная как аргумент, возвращает U
, а не Optional<U>
; этот метод будет охватывать сам U
Поэтому вы должны:
Optional.of(1).map(i -> i.toString()).map(j -> Integer.parseInt(j))
(примечание: также Integer.valueOf()
не был тем, что вы имели в виду, это не принимает String
в качестве аргумента)
Наконец, ваши лямбды можно заменить ссылками на методы:
Optional.of(1).map(Object::toString).map(Integer::parseInt)