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()
的正确类型......
答案 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目标类型的概念已经扩展到包括方法参数。所以这不再需要了。