开发者社区> 问答> 正文

开发中遇到的一个java泛型的问题

  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
    }

为什么第一种方法要报错,但最后一种却可以?

展开
收起
蛮大人123 2016-03-10 10:52:16 1968 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    出错原因是你使用了一个引用条件表达式(reference conditional expression)来给变量赋值,并且你的java se版本不是8.0
    由于条件表达式不在变量赋值或者调用的上下文中,属于standalone reference conditional expression,这种表达式的类型推断有三条的规则:
    1.当第二、第三表达式类型相同时,该类型作为条件表达式的类型
    2.当第二、第三表达式类型其中之一是 null type,另一个是引用类型,引用类型作为条件表达式的类型
    3.当第二、第三表达式类型分别为s1、 s2,t1、t2分别为s1、s2经过自动装箱转换后的类型,则 应用过capture conversionlub(t1, t2)为表达式类型
    由于你的条件表达式第二个和第三个表达式类型不一样,分别是 List<T> List<String> ,由于没有给emptyList()指定类型,所以这里T是Object。适用第三条规则,最终的类型是 lub(List<Object>, List<String>) ,lub是 least upper bound 的缩写,在这里指最小公共上界,结果是 List<? extends Object>。
    至于 capture conversion,主要是为了从含有通配符的泛型中推断公共上界,我不清楚在这里对类型有没有贡献,猜测没有。
    所以到最后赋值的时候会报错,因为赋值类型和表达式类型不匹配。

    2019-07-17 18:57:08
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载