クラス A、B、C が継承するクラス M があるとします。
abstract M
A extends M
B extends M
C extends M
そして、私はこのようなことをしたいはずです:
val a0:A = ...
val b0:B = ...
val c0:C = ...
val a1:A = transform[A](a0)
val b1:B = transform[B](b0)
val c1:C = transform[C](c0)
Wheretransform
は基本的に各サブタイプに対して同じことを行い、結果オブジェクトの構築方法のみが異なります。
私には不可能な予感があり、コードをコピーして別の変換メソッドを作成するか、型キャストに頼る必要があります。それとももっと良い方法がありますか?
編集
def transform[T<:M](t:T):T
動作しないことに注意してください。A、B、または C を返そうとすると、以下のエラー メッセージが表示されます。
型 A の式が期待される型 T に準拠していません
型 B の式が期待される型 T に準拠していません
型 C の式が期待される型 T に準拠していません
編集2 おそらく、私がやろうとしていることに関するより詳細な情報:
transform(m:M) = {
val P = Property P computed from m
m match {
case a:A => construct and return new A from a with property P
case b:B => construct and return new B from b with property P
case c:C => construct and return new C from c with property P
case _ => error
}
}
そのようにすると、キャストが必要になります。
val a1:A = transform(a0).asInstanceOf[A]
val b1:B = transform(b0).asInstanceOf[B]
val c1:C = transform(c0).asInstanceOf[C]
私が排除したいもの。