Scala生成了不明确的case类和配套的apply方法



给定以下代码:

case class Foo(bar: String)
object Foo{
def apply(bar: String): Foo = Foo(bar)
}

如果我要调用Foo("foo"),那么我最终会对def apply(bar: String)进行无限递归调用。当然,我可以通过将应用程序实现更改为def apply(bar: String): Foo = new Foo(bar)来解决这个问题。但是,如果我理解正确的话,将为具有所有构造函数参数的case类生成一个apply方法。我的问题有两个:

1( 如果我自己编写并自动生成了Foo.apply(bar: String): Foo,为什么我不会收到一个编译错误,抱怨方法定义重复?

2( 如果生成的方法有不同的签名,我该如何调用它?

为什么我没有收到抱怨方法定义重复的编译错误?

因为您的apply()代码将替换case class自动生成的代码。它们并不同时存在。

这可以通过编译代码来证明,但在编译的"typer"阶段(第4阶段(之后转储中间状态。

%%> cat so.sc
case class Foo(bar: String)
object Foo{
def apply(bar: String): Foo = Foo(bar)
}
%%> scalac -Xprint:4 so.sc | less

所得到的输出只有一个object,只有一种apply()方法。

object Foo extends scala.AnyRef with Serializable {
def <init>(): Foo.type = {
Foo.super.<init>();
()
};
def apply(bar: String): Foo = Foo.apply(bar);
case <synthetic> def unapply(x$0: Foo): Option[String] = if (x$0.==(null))
scala.None
else
Some.apply[String](x$0.bar);
<synthetic> private def readResolve(): Object = Foo
}

如您所见,递归apply()方法位于自动生成的<synthetic>代码中。

最新更新