我有一个案例课
case class SiteID(channel: String, locale: String)
语言环境可以是“ en-GB”或“ en_GB”。所以我想用下划线代替连字符。
想法是进行转换,因此存在平等
SiteID(“ blabla”,“ en-GB”)== SiteID(“ blabla”,“ en_GB”)
我尝试了以下代码
case class SiteID(channel: String, locale: String)
object SiteID{
def apply(channel: String, locale: String):SiteID = SiteID(channel,locale.replace("-","_") )
}
答案 0 :(得分:3)
您可能正在递归地调用伴随对象的apply方法。 尝试使用新的运算符。
object SiteID {
def apply(channel: String, locale: String):SiteID =
new SiteID(channel,locale.replace("-","_") )
}
答案 1 :(得分:2)
使用Scala case class
构造,编译器会使用声明的参数自动为您生成apply
方法。如果您声明的另一个参数类型与case类相同,则它优先于编译器生成的参数类型。
因此,如另一个答案所述,您的apply
方法是递归调用的;提供了一个解决方案。如果还需要确保不会实例化任何SiteID("bla","en-GB")
值,则应将case类的构造函数声明为private:
case class SiteID private(channel: String, locale: String)
object SiteID {
def apply(channel: String, locale: String):SiteID =
new SiteID(channel,locale.replace("-","_") )
}
SiteID("bla","en-GB") //SiteID(a,en_GB)
new SiteID("bla","en-GB") //error