Вопрос о Scala Неявные преобразования Правило не двусмысленности

StackOverflow https://stackoverflow.com/questions/3962620

  •  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 выбран.

ОБНОВИТЬ: УДАЛЕНО ДЕЙСТВИТЕЛЬНЫЙ ПРИМЕР.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top