Почему компилятор может определить параметр родового типа для
но не для тернарного оператора (?
)?
У меня вопрос о том, что компилятор способен вывести общий тип
параметр в случае "прямого" назначения, но в случае тройного
оператора (?
). В моих примерах используется класс Guava Optional
, чтобы указать, но
Я думаю, что основная проблема является общей и не ограничивается Optional
.
Optional
имеет общую функцию absent()
:
public static <T> Optional<T> absent();
и я могу назначить Optional<T>
для Optional<Double>
:
// no compiler error
final Optional<Double> o1 = Optional.absent();
Как компилятор понимает, что T
должен быть Double
в этом случае. Потому как
при использовании тернарного оператора (?
) мне нужно сообщить компилятору конкретно
нам Integer
как общий параметр
// Type mismatch: cannot convert from Optional<capture#1-of ? extends Object> to Optional<Integer>
final Optional<Integer> o2 = true
? Optional.of(42)
: Optional.<Integer>absent();
в противном случае я получаю следующую ошибку
Несоответствие типов: невозможно преобразовать из
Optional<capture#1-of ? extends Object>
вOptional<Integer>
Почему существует разница между "прямым" назначением и использованием тройной оператор? Или есть что-то еще, что мне не хватает?