Связанные вызовы Optional.map вызывают ошибку компиляции

1

Я тестирую 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

Почему компилятор не доволен?

Теги:

1 ответ

1
Лучший ответ

Подпись 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню