【发布时间】:2011-11-24 01:47:45
【问题描述】:
我知道不可能重载仅在返回类型上有所不同的方法。但我想知道是否有任何聪明的策略可以有效地处理这种情况:
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]" 失败)。
【问题讨论】:
标签: scala overloading