我正在阅读Drools Planner示例,经常遇到这样的代码:
List<Column> columnList = new ArrayList<Column>(n);
据我理解,它应该初始化一个长度为n的列表,其中存储“Column”数据类型。
但是,在表达式的两侧具有不同的集合数据类型是什么意思?
如果“ArrayList”与“List”类型匹配,那么与执行以下操作有何不同:
List<Column> columnList = new List<Column>(n);
我正在阅读Drools Planner示例,经常遇到这样的代码:
List<Column> columnList = new ArrayList<Column>(n);
List<Column> columnList = new List<Column>(n);
List
是一个接口。你不能创建接口的实例。
ArrayList
是一个实现了List接口的类,你可以创建一个。
接口只是定义行为的规范。实现了接口的类就是实现了这个行为规范。
如果你查看API,会发现很多不同的类都实现了List
接口。这是因为它们都提供了List
定义的方法的实现。此外,这些实现通常大不相同,因为ArrayList
的工作方式与LinkedList
等其他类有所不同。
最好使用下面的形式
List list = new ListType()
因为这样以后你可以更改列表的实现,而不会影响你的代码。原因是如果你这么做
ListType list = new ListType()
list的类型是ListType
,只有ListType
和其子类的实例才能拥有这种类型。
如果你采用上述推荐的赋值方式,那么你就可以将实现了List
接口的任何东西分配给list
。
List
是一个接口,ArrayList
是List
的一种实现方式。
你不能使用new List<Column>(n)
,因为List
只是定义了必须被实现的方法。
将List = (some implementation)
这样做的想法是,你可以编写与接口协议相符的代码,而不受特定实现方式的影响。例如:你可以用LinkedList替换ArrayList,程序仍然能正常运行,尽管两者的实现方式完全不同且性能特征显然也不同。
List是一个接口,不能被实例化,所以new List
会触发编译时错误。您可以使用ArrayList<Column> columnList = new ArrayList<Column>(n);
,但这样做就不能轻松地在不同的List
实现之间切换(ArrayList
是其中之一)。
List实际上是一个接口,因此无法被实例化。所以为了使用List,你必须创建它的实现对象,例如:ArrayList。阅读http://docs.oracle.com/javase/1.4.2/docs/api/java/util/List.html获取更多信息。
List
是 columnList
的编译时类型,而 ArrayList
是运行时类型。