让我们建立一些背景。
Data
Metadata
Payload
.
trait Data[Metadata <: Product, Payload <: Product] extends Product {
def metadata: Metadata
def payload: Payload
}
case class M()
case class P()
case class D(metadata: M, payload: P) extends Data[M, P]
Processor
处理
元数据
和
不一样。
trait MetadataProcessor[Metadata <: Product] {
def apply() = "process metadata"
}
trait PayloadProcessor[Payload <: Product] {
def apply() = "process payload"
}
// both work
new MetadataProcessor[M]{}.apply() // "process metadata"
new PayloadProcessor[P]{}.apply() // "process payload"
希望如此
DataProcessor
元数据
和
有效载荷
. 这是一种方法:
trait DataProcessor[Metadata <: Product, Payload <: Product] {
def apply() = {
new MetadataProcessor[Metadata]{}.apply() +
new PayloadProcessor[Payload]{}.apply()
}
}
new DataProcessor[M,P]{}.apply() // "process metadataprocess payload"
new DataProcessor[D]{}.apply()
得到完全相同的输出。怎么做?
对于具有上述代码的交互式Scala环境,请随意查看
Scastie playground
.