在Scala中,您不需要使用“new”来创建新的“案例类”是什么原因? 我试着找了一段时间没有答案。
答案 0 :(得分:38)
您想要如何或为什么?正如另一个答案所指出的,如何只是自动生成的伴随对象上的apply
方法。
对于为什么:案例类经常用于在Scala中实现algebraic data types,而new
- less构造函数允许更优雅的代码(创建值看起来更像更像是通过模式匹配解构它,例如)并且更接近其他语言中的ADT语法。
答案 1 :(得分:14)
Case类具有预先构建的伴随对象,其中apply()
已实现。甚至有人抱怨过:How to override apply in a case class companion:)
答案 2 :(得分:4)
案例类在其伴随对象上为您提供了自动生成的 apply
函数,您可以像构造函数一样使用它。
在 Scala 反编译的字节代码中,您会发现apply
函数创建如下:
object Person {
def apply(name: String, age: Integer): Person = new Person(name,age)
}
示例:
case class Person(name: String, age: Integer)
以下三个都做同样的事情。
val p0 = new Person("Frank", 23) // normal constructor
val p1 = Person("Frank", 23) // this uses apply
val p2 = Person.apply("Frank", 23) // using apply manually
因此,如果你使用val p1 = Person("Frank", 23)
它不是构造函数,这是一个调用apply方法的方法。
请阅读scala-object-apply-functions了解详情。