【问题标题】:List vs ArrayList列表与数组列表
【发布时间】:2011-12-05 07:07:29
【问题描述】:
List<EventHandler<E>> listeners = new List<EventHandler<E>>();

为什么上面的行失败了:

无法实例化类型List&lt;EventHandler&lt;E&gt;&gt;

但这一个有效:

ArrayList<EventHandler<E>> listeners = new ArrayList<EventHandler<E>>();

【问题讨论】:

    标签: java generics


    【解决方案1】:

    List是接口,不能实例化接口。

    【讨论】:

      【解决方案2】:

      List是一个接口,你不能创建一个接口的实例

      试试

      List<EventHandler<E>> listeners = new ArrayList<EventHandler<E>>();
      

      【讨论】:

        【解决方案3】:

        List只是一个由ArrayList实现的接口

        见:http://download.oracle.com/javase/6/docs/api/java/util/List.html

        【讨论】:

          【解决方案4】:

          正确的做法是:

          List<EventHandler<E>> listeners = new ArrayList<EventHandler<E>>();
          
          • 通过接口引用对象 (List)
          • 使用具体类型 (ArrayList) 实例化对象(无法实例化接口)

          【讨论】:

            【解决方案5】:

            List&lt;T&gt;interface,因此您无法实例化它,因为 ArrayList&lt;T&gt;concrete 类,它是 List&lt;T&gt; 的实现。

            【讨论】:

              【解决方案6】:

              List 不能被实例化,因为它只是一个接口。

              但是,您可能还有另一个问题。

              你真的有一个叫做“E”的类吗?如果你这样做了,那么,你不应该没有很好的理由。

              诸如 E 和 T 之类的单个字母几乎专门用于表示泛型类型参数。将其读作:“这是对如何创建类或方法的一般描述,没有对任何特定类型的任何引用 - 您可以通过任何合法的引用类型来参数化此类”。

              因此,即使像 ArrayList&lt;T&gt; 这样的类也无法实例化 - 因为它们是类的通用“配方”,而不是真正的具体类。

              【讨论】:

              • 大概你的上下文无关链接应该引起人们注意 SO 已经吃掉了 ArrayList-parameterized-by-T 周围的尖括号。
              猜你喜欢
              • 2012-03-07
              • 1970-01-01
              • 2012-10-31
              • 2011-08-26
              • 2015-04-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多