如何在Scala中限制重写方法中的类型?

时间:2015-09-21 13:44:39

标签: scala functional-programming

trait Rendered
trait TemplateRendered extends Rendered
trait Media {
  def send[T <: Rendered](cooked:T)
}
case class EmailMedia() extends Media {
  override def send(cooked:TemplateRendered) {}  // compile error this line
}

我想要一个带有send()方法的Media模板,该方法接受子类Rendered对象。在具体的类(EmailMedia)中,我想将其锁定到Rendered的特定子类,或者在这种情况下是TemplateRendered。 (即使类中的类型比特征中的类型更具限制性/特异性)

我该怎么做?

这里的尝试并没有被编译器所喜欢。试过这个:

case class EmailMedia() extends Media {
  override def send[T <: TemplateRendered](cooked:T) {}
}

1 个答案:

答案 0 :(得分:8)

怎么样:

trait Rendered
trait TemplateRendered extends Rendered

trait Media[T <: Rendered] {
  def send(cooked: T): Unit
}

case class EmailMedia() extends Media[TemplateRendered] {
  override def send(cooked: TemplateRendered): Unit = {}
}

您希望Media提供多种通用方法吗?如果是这种情况,您可以考虑将该泛型参数移动到类型成员以使事情更具可读性:

trait Rendered
trait TemplateRendered extends Rendered
trait BazzRendered extends Rendered

trait Media {
  type SendRend <: Rendered
  type FooRend <: Rendered

  def send(cooked: SendRend): Unit
  def foo(bar: FooRend): Unit
}

case class EmailMedia() extends Media {
  type SendRend = TemplateRendered
  type FooRend = BazzRendered

  override def send(cooked: SendRend): Unit = {}
  override def foo(bar: FooRend): Unit = {}
}