Подтвердить что ты не робот

Вопрос о Scala неявных преобразованиях Неоднозначное правило

Может ли кто-нибудь объяснить мне следующую ситуацию с механизмом неявных преобразований 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 - неявное преобразование вставляется только в том случае, если нет другого возможного преобразования для вставки. Согласно этому правилу этот код не должен компилироваться вообще. Но код успешно скомпилирован и выполнен. Что я не понимаю?

Спасибо.

4b9b3361

Ответ 1

Причина этого указана в разделе 6.26.2 "Спецификация языка" Scala.

Прежде чем метод можно рассматривать как функцию, он должен быть преобразован в один, выполнив eta-расширение. Таким образом, должно быть применено еще одно неявное преобразование, и поэтому выбирается val.

UPDATE: удаленный неверный пример.

Оценка метода без параметров всегда выполняется неявно.