2

クラス 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]

私が排除したいもの。

4

2 に答える 2

3

それはとても簡単です:

class M
class A extends M
class B extends M

def transform[T <: M](obj: T): T = {
    obj
}

val a0:A = new A
val a1:A = transform(a0)
val b0:B = new B
val b1:B = transform(b0)
于 2015-06-28T13:54:22.567 に答える