0

假设我有以下 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
}

上面的代码编译得很好,但是当我将最后一行(对象测试中的方法“值”的主体)更改为

def value[A: ValueSource](index: Int): A = index.value

编译器抱怨找不到参数 F0 的隐式值:ValueSource[A]

在我看来,def value[A: ValueSource] 意味着我有一个隐含的值“ValueSource[A]”,那么为什么编译会失败呢?

4

1 回答 1

0

Ain与intoValueSourceOps没有关系,这使得推断它有问题对我来说,真正的问题是为什么当您显式调用该方法时它会起作用。Avalue

我猜想,当toValueSourceOp显式调用时,它必须推断相同A,因为这是唯一可用的隐式。

于 2013-03-11T09:51:15.900 回答