【发布时间】:2013-07-08 09:08:20
【问题描述】:
为什么编译器能够确定一个泛型类型参数
赋值,但不适用于三元运算符 (?)?
我有一个关于编译器能够推断出泛型类型的问题
参数在“直接”分配的情况下,但在三元的情况下失败
运营商 (?)。我的示例使用 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>
为什么“直接”赋值和使用三元赋值有区别 操作员?还是我还缺少其他东西?
【问题讨论】:
-
of方法的返回类型是什么? -
同
absent():public static <T> Optional<T> of(T reference); -
你用哪个版本的 javac 编译这个?
-
Java 版本为 Java 1.7。