Вопрос о 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 - неявное преобразование вставляется только в том случае, если нет другого возможного преобразования для вставки. Согласно этому правилу этот код не должен компилироваться вообще. Но код успешно скомпилирован и выполнен. Что я не понимаю?
Спасибо.
Ответы
Ответ 1
Причина этого указана в разделе 6.26.2 "Спецификация языка" Scala.
Прежде чем метод можно рассматривать как функцию, он должен быть преобразован в один, выполнив eta-расширение. Таким образом, должно быть применено еще одно неявное преобразование, и поэтому выбирается val
.
UPDATE: удаленный неверный пример.
Оценка метода без параметров всегда выполняется неявно.