这个涉及到List和ArrayList的语句是什么意思?

3

我正在阅读Drools Planner示例,经常遇到这样的代码:

List<Column> columnList = new ArrayList<Column>(n);

据我理解,它应该初始化一个长度为n的列表,其中存储“Column”数据类型。
但是,在表达式的两侧具有不同的集合数据类型是什么意思?
如果“ArrayList”与“List”类型匹配,那么与执行以下操作有何不同:
List<Column> columnList = new List<Column>(n);

1
列表是一个接口,你不能实例化它。 - milan
5个回答

7

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

ArrayList是一个实现了List接口的类,你可以创建一个。

接口只是定义行为的规范。实现了接口的类就是实现了这个行为规范。

如果你查看API,会发现很多不同的类都实现了List接口。这是因为它们都提供了List定义的方法的实现。此外,这些实现通常大不相同,因为ArrayList的工作方式与LinkedList等其他类有所不同。

最好使用下面的形式

List list = new ListType()

因为这样以后你可以更改列表的实现,而不会影响你的代码。原因是如果你这么做

ListType list = new ListType()

list的类型是ListType,只有ListType和其子类的实例才能拥有这种类型。

如果你采用上述推荐的赋值方式,那么你就可以将实现了List接口的任何东西分配给list


6

List是一个接口,ArrayListList的一种实现方式。

你不能使用new List<Column>(n),因为List只是定义了必须被实现的方法。

List = (some implementation)这样做的想法是,你可以编写与接口协议相符的代码,而不受特定实现方式的影响。例如:你可以用LinkedList替换ArrayList,程序仍然能正常运行,尽管两者的实现方式完全不同且性能特征显然也不同。


6

List是一个接口,不能被实例化,所以new List会触发编译时错误。您可以使用ArrayList<Column> columnList = new ArrayList<Column>(n);,但这样做就不能轻松地在不同的List实现之间切换(ArrayList是其中之一)。


我们何时以及为什么需要在不同的“List”实现之间进行切换? - cnova

1

1
作为其他答案的附注,值得注意的是,ListcolumnList 的编译时类型,而 ArrayList 是运行时类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接