Java 在使用三元运算符 ('?') 时是否无法推断出泛型类型参数?
为什么编译器能够确定赋值的泛型类型参数,而不能确定三元运算符 ()的泛型类型参数??
我有一个关于编译器能够在“直接”赋值的情况下推断出泛型类型参数的问题,但在三元运算符()的情况下失败。我的例子使用番石榴的类来表达我的观点,但我认为潜在的问题是通用的,不限于.?
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>
为什么“直接”赋值和使用三元运算符之间有区别?还是我错过了其他东西?