假设我们只有局部范围的隐式参数查找:
trait CanFoo[A] {
def foos(x: A): String
}
object Def {
implicit object ImportIntFoo extends CanFoo[Int] {
def foos(x: Int) = "ImportIntFoo:" + x.toString
}
}
object Main {
def test(): String = {
implicit object LocalIntFoo extends CanFoo[Int] {
def foos(x: Int) = "LocalIntFoo:" + x.toString
}
import Def._
foo(1)
}
def foo[A:CanFoo](x: A): String = implicitly[CanFoo[A]].foos(x)
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,LocalIntFoo胜过ImportedIntFoo.有人可以使用"静态重载决策规则(§6.26.3)"来解释它是如何被认为更具体的吗?
编辑:
名称绑定优先级是一个引人注目的参数,但有几个问题尚未解决.首先,Scala语言参考说:
如果有几个符合条件的参数与隐式参数的类型匹配,则将使用静态重载决策的规则(第6.26.3节)选择最具体的参数.
其次,名称绑定优先级是关于在范围内有多个变量/方法/对象的情况下解析x特定成员的已知标识符.并且没有相同的名称.pkg.A.B.xxImportIntFooLocalIntFoo
第三,我可以证明单独的 …
有什么方法可以选择在下面使用asJavaIterable?我知道我可以拼出那个特定的函数名称,但我想知道我是否可以明确地指定我想要的类型.我也很好奇为什么asJavaIterable没有优先于asJavaCollection.
scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._
scala> Iterable(0,1):java.lang.Iterable[Int]
<console>:11: error: type mismatch;
found : Iterable[Int]
required: java.lang.Iterable[Int]
Note that implicit conversions are not applicable because they are ambiguous:
both method asJavaIterable in object JavaConversions of type [A](i: Iterable[A])java.lang.Iterable[A]
and method asJavaCollection in object JavaConversions of type [A](i: Iterable[A])java.util.Collection[A]
are possible conversion functions from Iterable[Int] to java.lang.Iterable[Int]
Iterable(0,1):java.lang.Iterable[Int]
^
Run Code Online (Sandbox Code Playgroud)