【发布时间】:2014-10-27 04:17:05
【问题描述】:
我试图表达如下约束:
in a method def run[A, B](...), B must be equal to A#SomeInner
这是我的示例代码:
trait Wrapper {
type Implementation
implicit val instance: Data[Implementation]
}
trait Data[A] {
def create : A
}
object DataInstances {
implicit object IntData extends Data[Int] { def create = 0}
implicit object StringData extends Data[String] { def create = "<empty>"}
implicit object FloatData extends Data[Float] { def create = 0.5F}
}
import DataInstances._
object IntWrapper extends Wrapper { type Implementation = Int; implicit val instance = IntData }
object StringWrapper extends Wrapper { type Implementation = String; implicit val instance = StringData}
object FloatWrapper extends Wrapper { type Implementation = Float; implicit val instance = FloatData}
object Test extends App {
def run[W <: Wrapper, D](wrapper: W)(implicit data: Data[D], ev: D =:= W#Implementation) : D = {
data.create
}
run(StringWrapper)
}
这里我得到一个编译错误:
Error:(31, 6) ambiguous implicit values:
both object IntData in object DataInstances of type DataInstances.IntData.type
and object StringData in object DataInstances of type DataInstances.StringData.type
match expected type Data[D]
run(StringWrapper)
^
你能解释一下为什么编译器会觉得它模棱两可吗?
据我所知(以及我试图表达的)是,当我通过StringWrapper 时,根据类型相等证据,D 的唯一可能值将是String,因此@987654327 的唯一可能值@ 将是 StringData。
但显然编译器不这么认为:)
而正确表达这种约束的方法是什么?
【问题讨论】: