Вопрос о Scala Неявные преобразования Правило не двусмысленности
-
09-10-2019 - |
Вопрос
Может ли кто-нибудь объяснить мне следующую ситуацию с механизмом преобразования 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) возможны в этой ситуации. Eсть Правило без двусмысленности - Неявное преобразование вставляется только в том случае, если нет другого возможного преобразования для вставки. Согласно этому правилу, этот код не должен быть скомпилирован вообще. Но код успешно скомпилирован и выполнен. Что я не понимаю?
Спасибо.
Решение
Причина этого заявляет в спецификации Scala Language Section 6.26.2.
Перед тем, как метод можно будет рассматриваться как функция, ее необходимо преобразовать в одну, выполняя расширение ETA. Таким образом, будет применяться еще одно неявное преобразование, и поэтому val
выбран.
ОБНОВИТЬ: УДАЛЕНО ДЕЙСТВИТЕЛЬНЫЙ ПРИМЕР.
Оценка метода без параметров всегда выполняется неявно.