Scala 规范说:
如果有多个符合隐式参数类型的参数,则将使用静态重载解析规则选择最具体的一个。
https://www.scala-lang.org/files/archive/spec/2.13/07-implicits.html#implicit-parameters https://www.scala-lang.org/files/archive/spec/2.13/07-implicits.html#implicit-parameters
替代方案的相对权重A
超过替代方案B
是一个从 0 到 2 的数字,定义为
- 1 if
A
具体如下B
,否则为 0,并且
- 1 if
A
是在类或对象中定义的,该类或对象派生自定义的类或对象B
, 否则为 0。
https://www.scala-lang.org/files/archive/spec/2.13/06-expressions.html#overloading-resolution https://www.scala-lang.org/files/archive/spec/2.13/06-expressions.html#overloading-resolution
So 相对重量 of case1
over case2
1+0=1 且相对重量 of case2
over case1
是0+1=1。所以这就是歧义。
Error: ambiguous implicit values:
both method case2 in trait LPSearch of type [M[_], A](implicit ev: App.TypeClass2[M,A])App.Search[M[A]]
and method case1 in object Search of type [A](implicit ev: App.TypeClass1[A])App.Search[A]
match expected type App.Search[List[Int]]
implicitly[Search[List[Int]]]
在第二种情况下,使用低优先级特征是没有意义的,因为如果两个隐式都匹配预期类型,case2
当它们被定义在同一个对象中时是首选。所以尝试一下
object Search {
implicit def case1[A](implicit ev: TypeClass1[A]): Search[A] = null
implicit def case2[M[_], A](implicit ev: TypeClass2[M, A]): Search[M[A]] = null
}