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) {}
}
答案 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 = {}
}