为什么Scala在这个特定情况下找不到二级隐含值?

Owe*_*wen 8 polymorphism scala implicit

我很难解释主要隐式值或隐式转换所寻求的其他隐式值之间的行为差​​异.具体来说,这有效:

trait Foo[A]
implicit def fooString: Foo[String] = null

implicit def value[A](implicit foo: Foo[A]) = 5

> implicitly[Int]
5
Run Code Online (Sandbox Code Playgroud)

但这不是:

implicit def conversion[A](x: Int)(implicit foo: Foo[A]) = new {
    def aMethod = 5
}

> 1.aMethod
could not find implicit value for parameter foo: test.Foo[A]
Run Code Online (Sandbox Code Playgroud)

变化:

  • 搜索是由启动implicitly还是隐式转换
  • 寻求的次要隐含值是否是多态的
  • 提供的辅助隐式值是否是多态的

我得到以下结果:

Conversion/value  Searching for  Supplied | Works?
----------------  -------------  -------- | ------
     conversion     poly          poly    |  yes
     conversion     poly          mono    |  **no**
     conversion     mono          poly    |  yes
     conversion     mono          mono    |  yes
     value          poly          poly    |  yes
     value          poly          mono    |  yes
     value          mono          poly    |  yes
     value          mono          mono    |  yes
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,唯一不起作用的情况是当通过隐式转换启动搜索时,所寻求的值是多态的,但提供的值是单态的.

是否存在理论上的原因,或者这是Scala的错误/限制?

Mil*_*bin 7

你被scalac bug SI-3346咬了.更一般地,参见SI-4699的描述,尤其是 第(1)点,

1)隐式搜索和隐式转换搜索以不同方式处理未确定的类型参数

您正在直接观察您的案例区分隐含值和隐式转换的位置.

我已经更新了SI-3346,将其作为一个附加示例.