小编典典

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

java

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
转换为List

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


阅读 210

收藏
2020-11-01

共1个答案

小编典典

我可以在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-in​​ference/

2020-11-01