このコードを考えると:
trait S {
def s: String
}
trait I {
def i: Int
}
case class CC_S(s: String) extends S
case class CC_I(i: Int) extends I
case class CC_S_I(s: String, i: Int) extends S with I
def combine(s: S, i: I): S with I = CC_S_I(s.s, i.i)
このテストは成功します:
Assert.assertEquals(CC_S_I("s", 1), combine(CC_S("s"), CC_I(1)))
(どのように) 型パラメーターを持つトレイトとして結合メソッドをジェネリックにすることができますか? つまり、次のように定義したいと思います。
trait MyTrait[A,B] {
def combine(a: A, b: B): A with B
}
私はこのようにそれを使用できるように:
class MyClass[A <: CC_S, B <: CC_I] extends MyTrait[A,B] {
override def combine(s: A, i: B) = CC_S_I(s.s, i.i) //Note: this line does not compile...
}
Assert.assertEquals(CC_S_I("s", 1), new MyClass().combine(CC_S("s"), CC_I(1)))
更新します。これはより良い例でした:
class MyClass[A <: S, B <: I] extends MyTrait[A,B] {
override def combine(s: A, i: B) = CC_S_I(s.s, i.i) //Note: this line does not compile...
}
Travis の回答の下にあるコメントを参照して、回答も確認してください。