【发布时间】:2016-09-26 11:47:22
【问题描述】:
我不太明白下面的代码:
object M {
implicit object AMarker
implicit object BMarker
def m(ints: Seq[Int])(implicit i: AMarker.type ): Unit = {
println(s"int seq $ints");
}
def m(strs: Seq[String])(implicit s: BMarker.type ): Unit = {
println(s"string seq $strs")
}
}
import M._
m(Seq(1, 2, 3))
m(Seq("a", "b", "c"))
如果没有这两个标记,它将无法编译,因为这两个 m 方法在类型擦除后具有相同的签名。
但是,我不明白将AMarker 链接到Seq[Int] 以及将BMarker 链接到Seq[String] 的“魔法”是什么。
更具体地说,当我调用m(Seq("a", "b")) 时,编译器如何知道它应该使用隐式BMarker,并调用第二个m? Seq 不是已经被删除了吗?
【问题讨论】:
-
因为 Seq[A] 的类型信息在编译时可用以调用正确的方法,但该信息在运行时不可用
-
不是您问题的答案,而是一个有趣的观察:您还可以通过将一个
m()设为函数并将另一个作为方法来消除歧义。不需要隐含或标记。