隐式参数不起作用

时间:2013-03-11 09:12:52

标签: scala implicits

假设我有以下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]”,那为什么编译会失败?

1 个答案:

答案 0 :(得分:0)

A中的toValueSourceOpsA中的value关系,这使得它有问题。对我来说,真正的问题是当你明确地调用方法时它的工作原理。

我猜测,当toValueSourceOp被明确调用时,它来推断相同的A,因为这是唯一隐含的可用。