我很难解释两者之间的行为差异
由主隐式值或
隐式转换。具体来说,这可行:
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,将其作为附加示例。