【问题标题】:Why does this not compile : List<List<String>> lss = new ArrayList<ArrayList<String>>(); [duplicate]为什么这不能编译: List<List<String>> lss = new ArrayList<ArrayList<String>>(); [复制]
【发布时间】:2014-01-09 06:10:46
【问题描述】:

以下代码:

List<List<String>> lss = new ArrayList<ArrayList<String>>();

导致此编译时错误:

Type mismatch: cannot convert from ArrayList<ArrayList<String>> to List<List<String>>

要修复,我将代码更改为:

List<ArrayList<String>> lss = new ArrayList<ArrayList<String>>();

为什么会抛出这个错误?这是因为 List&lt;List&lt;String&gt;&gt; 中的泛型 List 被实例化了,而且由于 List 是一个接口,这是不可能的?

【问题讨论】:

    标签: java generics arraylist


    【解决方案1】:

    来自http://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

    注意:给定两个具体类型 A 和 B(例如,Number 和 整数),MyClass&lt;A&gt;MyClass&lt;B&gt; 无关,无论 A和B是否相关。 MyClass&lt;A&gt;的共同父母 而MyClass&lt;B&gt; 是对象。

    【讨论】:

      【解决方案2】:

      问题是泛型中的类型说明符不允许(除非您告诉它)允许子类。你必须完全匹配。

      试试:

      List<List<String>> lss = new ArrayList<List<String>>();
      

      或:

      List<? extends List<String>> lss = new ArrayList<ArrayList<String>>();
      

      【讨论】:

      • 没错, 大括号中的所有内容都应该匹配。只有 大括号之前的类可以是子类型。
      【解决方案3】:

      同样的原因

      List<List> myList = new ArrayList<ArrayList>();
      

      不会工作。

      您可以查看this问题了解更多详情。

      【讨论】:

        猜你喜欢
        • 2014-07-22
        • 2017-05-08
        • 2018-05-19
        • 1970-01-01
        • 2013-03-27
        • 2015-12-07
        • 1970-01-01
        • 2014-04-12
        • 2012-04-08
        相关资源
        最近更新 更多