使用新的Scala最终案例类

Sur*_*Sen 5 scala final class case new-operator

在"Scala编程"一书的第22章中,::类(cons)被定义为

final case class ::[T](hd: T, tl: List[T]) extends List[T] {
  //...
}
Run Code Online (Sandbox Code Playgroud)

::类中的方法List定义如下:

def ::[U >: T](x: U): List[U] = new scala.::(x, this)
Run Code Online (Sandbox Code Playgroud)

为什么new需要创建一个实例?这纯粹是为了消除歧义吗?finalcaseclass ::

Lui*_*hys 6

使用case类,你会自动获得一个伴随对象,apply该对象的方法调用构造函数,就像使用普通类一样:

class Foo(val value: Int) 
object Foo { def apply(value: Int) = new Foo(value) }

val x = new Foo(42)  //
val y = Foo(42)      // both work the same
Run Code Online (Sandbox Code Playgroud)

您可以根据需要实例化案例类new.它理论上可能稍快一点,因为它不必通过伴随对象的apply方法,但我尝试了一个快速的基准测试,并且看到性能完全没有差异,所以我猜它是由编译器优化的,或者只是一个不可估量的小差异与实际施工相比.

所以我认为new你给出的例子中没有任何意义,也可能被遗漏了.