当你创建一个 case class 时,编译器会自动生成一个相应的伴生对象,其中包含一些 case class 特性:apply
工厂方法匹配主构造函数、equals
、hashCode
和 copy
。
有点奇怪的是,这个生成的对象扩展了 FunctionN。
scala> case class A(a: Int)
defined class A
scala> A: (Int => A)
res0: (Int) => A = <function1>
仅当以下条件同时满足时才适用:
- 没有手动定义的伴生对象
- 恰好有一个参数列表
- 没有类型参数
- 这个案例类不是抽象的。
有人使用过此功能,或者知道为什么要添加它吗?它会通过静态转发方法稍微增加生成的字节码大小,并出现在伴生对象的#toString()
方法中:
scala> case class A()
defined class A
scala> A.toString
res12: java.lang.String = <function0>
更新
手动创建只有一个apply
方法的对象不会自动被视为FunctionN
:
object HasApply {
def apply(a: Int) = 1
}
val i = HasApply(1)
// fails
// HasApply: (Int => Int)