假设我有以下scala代码:
trait ValueSource[A] {
def value(a: Int): A
}
trait ValueSourceOps[A] {
def self: Int
def F: ValueSource[A]
def value: A = F.value(self)
}
trait ToValueSourceOps {
implicit def toValueSourceOps[A](index: Int)(implicit F0: ValueSource[A]): ValueSourceOps[A] = new ValueSourceOps[A] {
def self = index
def F: ValueSource[A] = F0
}
}
object Test extends ToValueSourceOps {
def value[A: ValueSource](index: Int): A = toValueSourceOps(index).value
}
上面的代码编译得很好,但是当我将最后一行(对象Test中方法“value”的主体)更改为
时def value[A: ValueSource](index: Int): A = index.value
编译器抱怨说 找不到参数F0的隐含值:ValueSource [A]
在我看来,def值[A:ValueSource]意味着我有一个隐含值“ValueSource [A]”,那为什么编译会失败?
答案 0 :(得分:0)
A
中的toValueSourceOps
与A
中的value
有无关系,这使得它有问题。对我来说,真正的问题是当你明确地调用方法时它的工作原理。
我猜测,当toValueSourceOp
被明确调用时,它有来推断相同的A
,因为这是唯一隐含的可用。