3
我不太明白下面的代碼:Scala的隱式方法的參數不確定性消除
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]的類型信息在編譯時可用於調用正確的方法,但該信息在運行時不可用 – Falmarri
不是您的問題的答案,而是一個有趣的觀察:您還可以消除不明確性通過創建一個'm()'函數並將另一個作爲方法。沒有暗示或標記需要。 – jwvh