当您创建一个案例类时,编译器会创建一个相应的伴随对象,其中包含一些案例类的好东西:一个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)