当前位置:  开发笔记 > 编程语言 > 正文

案例类默认应用方法

如何解决《案例类默认应用方法》经验,为你挑选了2个好方法。

假设我们有以下案例类:

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")

这是如何运作的?



1> marios..:

案例类隐含地伴随着一个伴随对象,其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> Lodewijk Bog..:

Scala案例类是语法糖.创建案例类时,Scala编译器将为您创建一个带有applyunapply方法的伴随对象,然后您就可以像使用它一样使用它.以下是有关案例类的更深入信息的链接.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有