我刚刚在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。
最佳答案
更改:
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
。这是番石榴Ordering
类中natural
的方法声明:public static <C extends Comparable> Ordering<C> natural()
通过调用
Ordering.<String>natural()
,您将明确声明<C>
为<String>
。请注意,此方法适用于将类型声明为方法声明一部分的任何方法,就像
Collections
中几乎所有静态方法一样。关于java - Guava 中的三元运算符问题:无法从Ordering <Comparable>转换为Ordering <String>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26411963/