我知道不可能重載僅在返回類型中有所不同的方法。但我不知道是否有任何智能戰略,這種情況有效地處理:解決超載限制(實現幾種類型的特徵)
trait Reader[A] { def read(in: java.io.DataInput): A }
trait B; trait C
def doSomethingB()(implicit r: Reader[B]) =()
def doSomethingC()(implicit r: Reader[C]) =()
trait MultiReader extends Reader[B] with Reader[C] { // not possible
implicit me = this
doSomethingB()
doSomethingC()
}
通過智能和高效的我的意思是,我想避免混亂和不必要的內部類代這樣的:
trait MultiReader {
implicit object RB extends Reader[B] { ... }
implicit object RC extends Reader[C] { ... }
doSomethingB()
doSomethingC()
}
編輯
這是一個部分解決方案。 Miles Sabin在最近的幾天裏一直在重讀this gist,這看起來非常鼓舞人心。因此,我可以做到以下幾點:
type Tagged[U] = { type Tag = U }
type @@[T, U] = T with Tagged[U]
trait Reader[A] { def read(in: java.io.DataInput @@ A): A }
然後這個工程:
trait MultiReader {
def read(in: java.io.DataInput @@ B): B
def read(in: java.io.DataInput @@ C): C
}
但是繼承仍然有所打破:
trait MultiReader extends Reader[B] with Reader[C]
(失敗"self-type MultiReader does not conform to Reader[B]'s selftype Reader[B]"
)。