Scala 2.10 では値クラスが導入されており、これはクラスを extends にすることで指定できますAnyVal
。値クラスには多くの制限がありますが、それらの大きな利点の 1 つは、新しいクラスを作成するペナルティなしで拡張メソッドを使用できることです。値クラスを配列に入れるなどのボックス化が必要でない限り、それは単純に古いクラスに加えたものです。クラスを最初のパラメーターとして受け取る一連のメソッド。したがって、
implicit class Foo(val i: Int) extends AnyVal {
def +*(j: Int) = i + j*j
}
i + j*j
(JVM がメソッド呼び出しをインライン化すると) 自分で作成するよりもコストがかからないものにアンラップします。
残念ながら、値クラスを記述するSIP-15の制限の 1 つは、
- C の基になる型は、値クラスではない場合があります。
たとえば、ボクシングのオーバーヘッドなしでタイプセーフなユニットを提供する方法として、手に入れることができる値クラスがある場合 (本当に必要な場合を除く):
class Meter(val meters: Double) extends AnyVal {
def centimeters = meters*100.0 // No longer type-safe
def +(m: Meter) = new Meter(meters+m.meters) // Only works with Meter!
}
それでは、Meter
オブジェクト作成のオーバーヘッドなしでエンリッチする方法はありますか? SIP-15 の制限により、明らかな
implicit class RichMeter(m: Meter) extends AnyVal { ... }
アプローチ。