ケースクラスを作成すると、コンパイラは、いくつかのケースクラスの機能を備えた対応するコンパニオンオブジェクトを作成します。apply
プライマリコンストラクタ、、、、およびに一致するファクトリequals
メソッドhashCode
ですcopy
。
奇妙なことに、この生成されたオブジェクトはFunctionNを拡張します。
scala> case class A(a: Int)
defined class A
scala> A: (Int => A)
res0: (Int) => A = <function1>
これは、次の場合にのみ当てはまります。
- 手動で定義されたコンパニオンオブジェクトはありません
- パラメータリストは1つだけです
- 型引数はありません
- ケースクラスは抽象的ではありません。
このように約2年前に追加されたようです。最新の化身はここにあります。
誰かがこれを使用しますか、またはそれが追加された理由を知っていますか?静的フォワーダーメソッドを使用すると、生成されたバイトコードのサイズが少し大きくなり#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)