private static List<String> getList(String content){
// return content==null ? Collections.emptyList():new ArrayList<String>();//error: cannot convert from List<capture#1-of ? extends Object> to List<String>
// return content==null ? Collections.<String>emptyList():new ArrayList<String>();//ok
return Collections.emptyList();//ok
}
为什么第一种方法要报错,但最后一种却可以?
出错原因是你使用了一个引用条件表达式(reference conditional expression)来给变量赋值,并且你的java se版本不是8.0
由于条件表达式不在变量赋值或者调用的上下文中,属于standalone reference conditional expression,这种表达式的类型推断有三条的规则:
1.当第二、第三表达式类型相同时,该类型作为条件表达式的类型
2.当第二、第三表达式类型其中之一是 null type,另一个是引用类型,引用类型作为条件表达式的类型
3.当第二、第三表达式类型分别为s1、 s2,t1、t2分别为s1、s2经过自动装箱转换后的类型,则 应用过capture conversion
的lub(t1, t2)
为表达式类型
由于你的条件表达式第二个和第三个表达式类型不一样,分别是 List<T>
和 List<String>
,由于没有给emptyList()
指定类型,所以这里T是Object。适用第三条规则,最终的类型是 lub(List<Object>, List<String>)
,lub是 least upper bound
的缩写,在这里指最小公共上界,结果是 List<? extends Object>。
至于 capture conversion
,主要是为了从含有通配符的泛型中推断公共上界,我不清楚在这里对类型有没有贡献,猜测没有。
所以到最后赋值的时候会报错,因为赋值类型和表达式类型不匹配。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。