次のようなポリモーフィックな特性が与えられた場合
trait Transform[T] { def apply( t: T ) : T }
次のようなさまざまな特殊なインスタンスを実装したい場合があります。
case class Add[Double] extends Transform[Double] { def apply( t: Double ) ... }
case class Append[String] extends Transform[String] { def apply( t: String ) ... }
など。現在、頻繁に必要とされる変換は恒等変換でもあります。型 T ごとに ID を特殊化する代わりに、すべての型 T に対して単一のインスタンスを 1 つだけ使用する方が望ましいようです。私の質問は、Scala でこれを実現する最善の方法は何ですか?
ここに私が見つけたものがあります: List[T] が List.empty[T] と Nil を実装する方法を見て、私は Nothing を型 T として使用してみました. Nothing は他のすべての型のサブタイプであるため、これは理にかなっているようです:
object Identity extends Transform[Nothing] {
def apply( t: Nothing ) = t
}
これはうまくいくようです。ただし、このインスタンスをそのまま使用したい場合は、次のようにします。
val array = Array[Transform[String]]( Transform.Identity )
「タイプの不一致; 検出: Identity.type, 必須: Transform[String]」というコンパイラ エラーが発生します。それを使用するには、明示的にキャストする必要があります。
... Identity.asInstanceOf[Transform[String]]
これが最善の方法であるか、それとも「適切な」方法であるかはわかりません。アドバイスをありがとう。