Может ли кто-нибудь объяснить мне следующую ситуацию с механизмом неявных преобразований Scala. Существует код:
object Main {
implicit val x:Int => String = v => "val"
implicit def y(v:Int) = "def"
def p(s:String) = print(s)
def main(args: Array[String]): Unit = {
p(1)
}
}
Этот код печатает "val". Но когда я прокомментирую вторую строку:
//implicit val x:Int => String = v => "val"
код печатает "def".
Таким образом, возможны и неявные преобразования (x и y) в этой ситуации. Существует правило Non-Ambiguity Rule - неявное преобразование вставляется только в том случае, если нет другого возможного преобразования для вставки. Согласно этому правилу этот код не должен компилироваться вообще. Но код успешно скомпилирован и выполнен. Что я не понимаю?
Спасибо.