在Java中"实例化"一个列表?

hel*_*253 121 java list

尝试使用以下代码:

List<Integer> list = new List<Integer>();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

java.util.List是抽象的; 无法实例化

这是什么意思,为什么我不能List以同样的方式初始化ArrayList

Eti*_*tel 174

在Java中,List是一个接口.也就是说,它无法直接实例化.

相反,您可以使用ArrayList哪个接口的实现,该接口使用数组作为其后备存储(因此名称).

既然ArrayList 一种List,你可以轻松地将它改为:

List<T> mylist = new ArrayList<T>();
Run Code Online (Sandbox Code Playgroud)

这与.NET形成对比,从版本2.0开始,它List<T>IList<T>接口的默认实现.


SLa*_*aks 28

List是一个接口,而不是具体的类.
接口只是一个类可以实现的一组函数; 实例化接口没有任何意义.

ArrayList 是一个具体的类,恰好实现了这个接口及其中的所有方法.


Eng*_*uad 27

使用 List<Integer> list = new ArrayList<Integer>();

  • 这是做到这一点的方法. (5认同)

Mic*_*rry 11

List是接口,而不是类,因此无法实例化.ArrayList很可能是你想要的:

ArrayList<Integer> list = new ArrayList<Integer>();

Java中的接口实质上定义了类的蓝图 - 实现接口的类必须提供列表定义的方法的实现.但ArrayList在这种情况下,实际的实现完全取决于实现类.

JDK还提供了LinkedList- 一种替代实现,它再次符合列表界面.它与ArrayList底层的工作方式非常不同,因此在列表中间添加/删除项目时效率更高,但对于绝大多数用例而言效率较低.当然,如果你想定义自己的实现,它是完全可能的!

简而言之,你不能创建一个列表,因为它是一个不包含具体代码的接口 - 这是实现该列表的类的工作,其中ArrayList迄今为止使用最多(并且有充分的理由!)

值得注意的是,在C#中,a List是一个类,而不是一个接口 - 就是这样IList.同样的原则也适用,只是名称不同.