あなたが望むのは次のようなものだと思います:
trait X {
def apply[T](obj: T): T
}
trait A {
def following(modifier: X) = modifier(this)
}
case class B() extends A
case class C() extends A
object Y extends X {
override def apply[B](obj: B): B = { obj }
override def apply[C](obj: C): C = { obj }
}
object Z extends X {
override def apply[B](obj: B): B = { obj }
override def apply[C](obj: C): C = { obj }
}
残念ながら、オーバーライドされた apply メソッドを 2 つ持つことはできないと思います。そのため、コンパイルされません。これが可能であれば、私も喜んでお知らせします。現時点でできることは、パターン マッチングで 1 つの apply メソッドを使用することです。
trait X {
def apply[T](obj: T): T
}
trait A {
def following(modifier: X) = modifier(this)
}
case class B() extends A
case class C() extends A
object Y extends X {
override def apply[T](obj: T): T = {
obj match {
case o: B => obj
case o: C => obj
}
}
}
object Z extends X {
override def apply[T](obj: T): T = {
obj match {
case o: B => obj
case o: C => obj
}
}
}
まったく同じ効果 (構文を含む) を別の方法で得ることもできます。私の意見では、はるかにクリーンで理解しやすいです。
sealed trait X
case class Y() extends X
case class Z() extends X
trait A[T] {
def following(modifier: X): T
}
case class B() extends A[B] {
override def following(modifier: X) = modifier match {
case o: Y => this
case o: Z => this
}
}
case class C() extends A[C] {
override def following(modifier: X) = modifier match {
case o: Y => this
case o: Z => this
}
}