Java三元运算符对泛型类型推断的影响 公共列表foo1(){ List retval=bar(); if(retval==null) 返回集合。emptyList(); 其他的 返回返回; } 公众名单2(){ List retval=bar(); return retval==null?Collections.emptyList():retval; }

Java三元运算符对泛型类型推断的影响 公共列表foo1(){ List retval=bar(); if(retval==null) 返回集合。emptyList(); 其他的 返回返回; } 公众名单2(){ List retval=bar(); return retval==null?Collections.emptyList():retval; },java,generics,compiler-errors,java-7,Java,Generics,Compiler Errors,Java 7,为什么foo1()编译很好,而foo2()有错误?(更准确地说是“类型不匹配:无法从列表转换到列表”) 我本以为这两个函数都会编译成相同的字节码,因此聪明的编译器应该为emptyList()…推断正确的类型,这与类型有关 如果代码在版本之前。8.必须声明此案例的结果类型 return retval==null?Collections.emptyList():retval 从那以后。8什么是目标类型的概念已经扩展到包括方法参数。因此,这不再是必需的 在java 8中为我编译得很好 Java的早期版

为什么
foo1()
编译很好,而
foo2()
有错误?(更准确地说是“类型不匹配:无法从列表转换到列表”)

我本以为这两个函数都会编译成相同的字节码,因此聪明的编译器应该为
emptyList()

推断正确的类型,这与类型有关

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

return retval==null?Collections.emptyList():retval


从那以后。8什么是目标类型的概念已经扩展到包括方法参数。因此,这不再是必需的

在java 8中为我编译得很好

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;
}
return retval==null?Collections.emptyList():retval;
应该有用

编辑 这是由于Java8类型推断的改进,如下所述


这里有一个博客,其中有一些亮点:

您使用的是哪个Java版本?它们对我来说都很好(Java 8U5)。bar
返回了什么?你能把密码寄出去吗?并且是
Collections.emptyList()
retval
中的错误吗?@AnubianNoob Yes,
列表栏()
。但我认为这与错误无关。这就解释了问题…我们不接受仅链接的答案。请改进答案或将其移至评论中。请参阅第12节,并不是说我比你长。但是没有必要重写原始页面。与oracle相比,SO更可能不会过期;-)。我知道其他Q/As中有很多Oracle链接已经过期。因此,在这里发布解释总比仅仅参考外部链接要好。这些链接应该是为了获得更多的信息来备份答案,而不是答案。因此,生命周期意味着什么。因此,发布的规则几乎每天都在变化。@LuiggiMendoza Java 8改进了它的类型推断,好的,将其添加到您的答案中,否则看起来像是一条带有一些代码的长注释。@lpratlong它在Java 8中编译。正如我在《OP问题:你在使用哪个Java版本?@dkatzel抱歉,我很愚蠢,我不测试同样的东西:)。工作正常:Luiggi,不,它的解决方案是针对Java<8的。它确实有效。我不知道语法
Foo.bar()
。这是Java8的新功能吗?
return retval == null ? Collections.<String>emptyList() : retval;