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

CSn*_*erd 6 scala

Array没有给出初始值时而言,new是必需的,还有一个显式类型:

val ary = new Array[Int](5)
Run Code Online (Sandbox Code Playgroud)

但对于List:

val list1 = List[Int]() // "new" is not needed here.
Run Code Online (Sandbox Code Playgroud)

添加时new,会发生错误:

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

为什么会这样?

Chr*_*tin 10

使用newalways意味着你正在调用构造函数.

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

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

scala> Array[Int](5)
res1: Array[Int] = Array(5)
Run Code Online (Sandbox Code Playgroud)

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

第二个表达式是desugars Array.apply[Int](5),并Array指向伴随对象.

你不能写new List,因为错误和文档说的List是抽象的.

当你写作时List(5),你在同伴对象apply上调用方法.List

scala> List[Int](5)
res2: List[Int] = List(5)
Run Code Online (Sandbox Code Playgroud)

List没有你可以调用的构造函数,因为它List是抽象的.List是抽象的,因为它是一个利弊清单,这样一个List实例可以是consnil(或如Scala库调用它们,::Nil).

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

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