我刚刚在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/

10-10 14:07