Scala中Array和List初始化之间的区别

时间:2014-12-08 04:49:19

标签: scala

Array而言,如果没有给出初始值,则需要new以及显式类型:

val ary = new Array[Int](5)

List

val list1 = List[Int]() // "new" is not needed here.

当我添加new时,会发生错误:

scala> val list = new List[Int]()
<console>:7: error: class List is abstract; cannot be instantiated
       val list = new List[Int]()

为什么会这样?

2 个答案:

答案 0 :(得分:9)

使用new始终意味着您正在调用构造函数。

似乎对类和伴侣对象之间的区别存在一些混淆。

scala> new Array[Int](5)
res0: Array[Int] = Array(0, 0, 0, 0, 0)

scala> Array[Int](5)
res1: Array[Int] = Array(5)

在第一个表达式中,Array引用了类型,并且您正在调用构造函数。

第二个表达式涉及Array.apply[Int](5),而Array指的是伴随对象。

您无法撰写new List,因为错误和the doc表示List是抽象的。

当您撰写List(5)时,您正在List's companion object上调用apply方法。

scala> List[Int](5)
res2: List[Int] = List(5)

List没有可以调用的构造函数,因为List是抽象的。 List是抽象的,因为它是一个缺点列表,因此List实例可以是consnil(或者,当Scala库调用它们时,::Nil)。

但如果你真的想要,可以调用::构造函数。

scala> new ::('a', new ::('b', Nil))
res3: scala.collection.immutable.::[Char] = List(a, b)

答案 1 :(得分:0)

首先,List是抽象的,因此无法实例化。

其次,您使用了List的错误方法。 List.apply使用参数中的元素初始化列表。您正在寻找List.fill(尽管您最好立即初始化其元素)。