就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]()
为什么会这样?
答案 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
实例可以是cons
和nil
(或者,当Scala库调用它们时,::
和Nil
)。
但如果你真的想要,可以调用::
构造函数。
scala> new ::('a', new ::('b', Nil))
res3: scala.collection.immutable.::[Char] = List(a, b)
答案 1 :(得分:0)
首先,List
是抽象的,因此无法实例化。
其次,您使用了List
的错误方法。 List.apply
使用参数中的元素初始化列表。您正在寻找List.fill
(尽管您最好立即初始化其元素)。