我刚刚在Guava的Ordering课程中遇到了这种奇怪的情况。
使用三元运算符代码:
Ordering<String> ordering = flag ? Ordering.natural().nullsFirst() : Ordering.natural().nullsLast();
注意:flag
是布尔变量。
我在Eclipse中显示了该行的错误:
Type mismatch: cannot convert from Ordering<Comparable> to Ordering<String>
但如果我将其更改为if-else阻止,则不会发现错误。
Ordering<String> ordering;
if (flag) {
ordering = Ordering.natural().nullsFirst();
}
else {
ordering = Ordering.natural().nullsLast();
}
任何人都可以解释这里发生的事情吗?
注意:我正在使用java 7。
答案 0 :(得分:3)
变化:
Ordering<String> ordering = flag ? Ordering.natural().nullsFirst() : Ordering.natural().nullsLast();
为:
Ordering<String> ordering = flag ? Ordering.<String>natural().nullsFirst() : Ordering.<String>natural().nullsLast();
这是有效的,因为它告诉Java编译器<C>
方法声明中的natural
应该是String
。这是Guava的Ordering
类natural
中的方法声明:
public static <C extends Comparable> Ordering<C> natural()
通过致电Ordering.<String>natural()
,您明确声明<C>
为<String>
。
请注意,这适用于任何具有声明为方法声明一部分的类型的方法,就像Collections
中的几乎所有静态方法一样。