class - 在 Scala final case 类中使用 new

标签 class scala new-operator case final

在“Scala 编程”一书中的第 22 章中,::类(缺点)定义为

final case class ::[T](hd: T, tl: List[T]) extends List[T] {
  //...
}
::类中的方法 List定义如下:
def ::[U >: T](x: U): List[U] = new scala.::(x, this)

为什么是new需要创建 final 的实例 case class :: ?这纯粹是为了消除歧义吗?

最佳答案

使用案例类,您会自动获得一个伴生对象,其 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

您可以使用 new 实例化案例类如果你想。理论上它可能会稍微快一点,因为它不必通过伴随对象的 apply方法,但我尝试了一个快速基准测试并发现性能绝对没有差异,所以我猜它是由编译器优化的,或者与实际构造相比只是一个不可估量的小差异。

所以我不认为 new在你给出的例子中有任何意义,也可以被排除在外。

关于class - 在 Scala final case 类中使用 new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514333/

相关文章:

scala - 根据参数双向循环 Scala

c++ - 无法创建新的 wchar_t *

c++ - 有人能解释一下如果在堆上分配对象数组的过程中抛出异常会发生什么吗?

c++ - 带有初始化器的堆上的多维数组

php - 如何创建嵌套的 PHP 值对象? (类(class))

python - 我的函数如何知道它正在接收什么类?

Python:通过实例对象调用方法: "missing 1 required positional argument: ' self'”

c++ - 引发异常:读取访问冲突。这是对象数组中的nullptr

eclipse - Scala 中的公共(public)变量?

Scala Cats效果-IO异步移位-如何工作?