Я не совсем понимаю, следующий код: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()' a и оставив ее как метод. Никаких имплицитов или маркеров не требуется. – jwvh