尝试使用以下代码:
List<Integer> list = new List<Integer>();
我得到以下错误消息:
java.util.List是抽象的,不能实例化
java.util.List
这意味着什么? 为什么我不能像初始化 ArrayList一样初始化 List?
ArrayList
List
使用 List<Integer> list = new ArrayList<Integer>();
List<Integer> list = new ArrayList<Integer>();
在 Java 中,List是一个 接口。也就是说,它不能被直接实例化。
相反,您可以使用 ArrayList,它是使用数组作为其后台存储的接口的实现(因此得名)。
由于 ArrayList 是是一种 List,你可以很容易地将它上传:
List<T> mylist = new ArrayList<T>();
这与.NET 形成了对比,在.NET 中,自2.0版以来,List<T>是 IList<T>接口的默认实现。
List<T>
IList<T>
List是一个接口,而不是一个具体的类。 接口只是类可以实现的一组函数; 实例化接口没有任何意义。
ArrayList是一个具体的类,碰巧实现了这个接口及其中的所有方法。
List在 Java 中并不存在。它是一个接口,一种定义对象如何与其他对象交互的方式。因此,它永远不能被实例化。ArrayList是 List接口的实现,链表也是如此,依此类推。用这个代替。
Java 中的 List是一个接口,它定义了“列表”必须具备的某些特性。具体的列表实现,例如 ArrayList实现了这个接口,并充实了各种方法的工作方式。你想通过这个列表达到什么目的?最有可能的是,其中一个内置列表将为您工作。
List是接口,而不是类,所以它不能被实例化:
ArrayList<Integer> list = new ArrayList<Integer>();
Java 中的接口实际上定义了类的蓝图——实现接口的类必须提供列表定义的方法的实现。但是实际的实现完全取决于实现类,在本例中是 ArrayList。
JDK 还提供了 LinkedList——一种同样符合列表接口的替代实现。它的工作原理与下面的 ArrayList非常不同,因此它在添加/删除列表的中间部分更有效率,但是对于绝大多数用例来说,它的效率较低。当然,如果您想要定义自己的实现,这是完全可能的!
LinkedList
简而言之,你不能创建一个列表,因为它是一个不包含具体代码的接口——这是实现该列表的类的工作,其中 ArrayList是目前为止使用最多的(并且有充分的理由!)
值得注意的是,在 C # 中,List是一个类,而不是一个接口——它是 IList。不过,同样的原则也适用,只是名称不同而已。
IList