我很难解释两者之间的行为差​​异
由主隐式值或
隐式转换。具体来说,这可行:

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

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

> implicitly[Int]
5


但这不是:

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]


变化:


搜索是通过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


如您所见,唯一不起作用的情况是开始搜索时
通过隐式转换,寻求的值是多态的,但该值
提供的是单态的。

有理论上的理由为什么应该这样,还是这
Bug / Scala的限制?

最佳答案

您被scalac bug SI-3346咬住了。更一般而言,请参见SI-4699的说明,尤其是。点(1),


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


您直接观察到的情况区分了隐式值和隐式转换。

我更新了SI-3346,将其作为附加示例。

07-28 02:37
查看更多