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,这种表达式的类型推断有三条的规则:
当第二、第三表达式类型相同时,该类型作为条件表达式的类型
当第二、第三表达式类型其中之一是 null type,另一个是引用类型,引用类型作为条件表达式的类型
当第二、第三表达式类型分别为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,主要是为了从含有通配符的泛型中推断公共上界,我不清楚在这里对类型有没有贡献,猜测没有。
所以到最后赋值的时候会报错,因为赋值类型和表达式类型不匹配。