在Java中“实例化”一个列表?
试图使用下面的代码:
List<Integer> list = new List<Integer>();
我收到以下错误信息:
java.util.List
是抽象的; 不能被实例化
这是什么意思,为什么我不能像ArrayList
一样初始化List
?
在Java中, List
是一个接口 。 也就是说,它不能直接实例化。
相反,您可以使用ArrayList
,它是使用数组作为其后备存储(因此名称)的接口的实现。
由于ArrayList
是一种List
,你可以很容易地向上播放:
List<T> mylist = new ArrayList<T>();
这与.NET相反,从版本2.0开始, List<T>
是IList<T>
接口的默认实现。
List
是一个接口,而不是一个具体的类。
一个接口只是一个类可以实现的一组函数; 实例化一个接口没有任何意义。
ArrayList
是一个具体的类,恰好实现了这个接口以及其中的所有方法。
使用List<Integer> list = new ArrayList<Integer>();
List
是接口,而不是一个类,所以它不能被实例化。 ArrayList
最有可能是你在之后:
ArrayList<Integer> list = new ArrayList<Integer>();
Java中的接口本质上定义了类的蓝图 – 实现接口的类必须提供列表定义的方法的实现。 但是实际的实现完全取决于实现类,在这种情况下是ArrayList
。
JDK还提供了LinkedList
– 一个可选的实现,它再次符合列表接口。 它与下面的ArrayList
工作方式非常不同,因此它在添加/删除项目一半的时候更加高效,但对绝大多数用例而言效率较低。 当然,如果你想定义你自己的实现,这是完全可能的!
简而言之,你不能创build一个列表,因为它是一个不包含具体代码的接口 – 这就是实现这个列表的类的工作,其中ArrayList
是目前使用最多的(并且有很好的理由!)
还值得注意的是,在C#中, List
是一个类,而不是一个接口 – 这是IList
。 同样的原则适用于不同的名称。
在Java中, List
不是真实的东西。 这是一个界面,一种定义对象如何与其他对象进行交互的方式。 因此,它不能被实例化。 ArrayList
是List
接口的一个实现,就像链表一样,依此类推。 改用这些。
java中的List
是定义“列表”必须具有的特定质量的接口。 特定的列表实现,比如ArrayList
实现这个接口,并且充实了各种方法的工作方式。 你想用这个清单来完成什么? 很可能,其中一个内置列表将为您工作。