我想你想要的是这样的:
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 方法,因此它不会编译。如果这是可能的,那么我也很乐意知道。你现在可以做的是使用一种应用模式匹配的方法:
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
}
}