Java三元运算符对泛型类型推断的影响

时间:2014-06-18 15:19:41

标签: java generics compiler-errors java-7

public List<String> foo1() {
    List<String> retval = bar();
    if (retval == null)
        return Collections.emptyList();
    else
        return retval;
}

public List<String> foo2() {
    List<String> retval = bar();
    return retval == null ? Collections.emptyList() : retval;
}

为什么foo1()编译得很好,而foo2()有错误? (更确切地说,“类型不匹配:无法从List&lt; capture#1-of?extends Object&gt;转换为List&lt; String&gt;”

我原以为两个函数都会编译成相同的字节码,所以一个聪明的编译器应该推断emptyList()的正确类型......

2 个答案:

答案 0 :(得分:27)

在java 8中为我编译好。

早期版本的Java可能需要更多帮助

return retval == null ? Collections.<String>emptyList() : retval;

应该有用。

修改 这是由于Java 8类型推断的改进,如此处所述

http://openjdk.java.net/jeps/101

这是一个重点突出的博客:http://blog.jooq.org/2013/11/25/a-lesser-known-java-8-feature-generalized-target-type-inference/

答案 1 :(得分:6)

这与类型Inference from a generic method有关。

如果是ver之前的代码。 8.必须声明此案例的结果类型。

return retval == null ? Collections.<String>emptyList() : retval;

自从ver。 8目标类型的概念已经扩展到包括方法参数。所以这不再需要了。