我很难解释之间的行为差异
通过主要隐式值或隐式值寻求附加隐式值
隐式转换。具体来说,这有效:
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]
Varying:
- 搜索是否开始于
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
正如你所看到的,唯一不起作用的情况是当搜索开始时
通过隐式转换,所寻求的值是多态的,但该值
提供的是单态的。
是否有理论上的原因解释为什么会出现这种情况,或者这是一个
Scala 的错误/限制?
你被scalac bug咬了SI-3346 https://issues.scala-lang.org/browse/SI-3346。更一般地请参阅描述SI-4699 https://issues.scala-lang.org/browse/SI-4699,特别是。点(1),
1)隐式搜索和隐式转换搜索对未确定类型参数的处理方式不同
您可以直接观察到您的案例区分隐式值和隐式转换的情况。
我已更新 SI-3346 以将其作为附加示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)