假设我们有以下案例类:
case class CasePerson(firstName: String)
我们还为它定义了一个伴侣对象:
object CasePerson {
def apply() = new CasePerson( "XYZ" )
}
请注意,在上面的示例中,我使用apply
方法显式定义了一个伴随对象,而没有定义默认的apply方法:
// This "default" apply has the same argument as the primary constructor of the case class
def apply(firstName : String) = new CasePerson(firstName)
问:那么Scala在哪里获得“默认”申请?我在这里明确定义了伴随对象,没有默认的apply,编译器仍然知道如何执行它:
val casePerson = CasePerson("PQR")
这是如何运作的?
答案 0 :(得分:5)
Scala案例类是语法糖。创建案例类时,Scala编译器将为您创建一个具有apply
和unapply
方法的伴随对象,然后您可以将其用作简单存在的方法。 Here是关于案例类的更深入信息的链接。
答案 1 :(得分:5)
案例类隐含伴随着具有apply()
的伴随对象,该对象具有与案例类的主要构造函数相同的参数。
那是:
case class CasePerson(firstName: String)
将伴随着
object CasePerson{
def apply(firstName: String) = new CasePerson(firstName)
}
现在,如果您还明确定义了一个伴随对象,您可以将其视为附加到隐式定义的对象。
例如,在您的示例中,您向协同对象添加了一个新的apply
:
object CasePerson{
def apply() = new CasePerson("XYZ")
}
这句话,您可以将其视为创建合并的伴侣对象:
object CasePerson{
def apply() = new CasePerson("XYZ") // the one manually added
def apply(firstName: String) = new CasePerson(firstName) // this one is automatically added
}
现在,如果您决定添加自己的apply
版本,该版本与主要构造函数具有相同的参数,那么这将掩盖案例类的默认行为。
object CasePerson{
def apply() = new CasePerson("XYZ")
def apply(s: String) = Seq(new CasePerson(s), new CasePerson(s)) // will replace the default factory for the case class
}
现在,如果您致电CasePerson("hi")
,它将生成:
List(CasePerson("hi"), CasePerson("hi"))
答案 2 :(得分:-1)
您也可以为firstName
类参数指定默认值。因此,您可以创建一个不传递参数的实例。
示例:
case class CasePerson(firstName : String = "XYZ")
val person = CasePerson()