Помимо преобразования в ожидаемый тип, два других типа «неявных представлений» в Scala - это когда вы выбираете несуществующего члена, а также когда вы применяете неприменимого члена.
Так что для x.f
, если x
не имеет f
, неявный поиск будет искать преобразование, которое поставляет f
.
для x.f(arg)
, если это не тип check, он будет искать преобразование, которое предоставляет метод f
, который выполняет проверку типа.
➜ ~ scala -Yimports:java.lang,scala,scala.Predef,scala.util,scala.util.chaining,scala.util.control.Breaks
Welcome to Scala 2.13.1 (OpenJDK 64-Bit Server VM, Java 11.0.3).
Type in expressions for evaluation. Or try :help.
scala> implicit class R(val s: String) { def charAt(n: Int, c: Char): Char = Try(s.charAt(n)).getOrElse(c) }
defined class R
scala> "abc".charAt(3, 'z')
res0: Char = z
Поскольку он рассматривает только альтернативные методы в случае неправильного применения, он не работает для использования объект с тем же именем, хотя и с использованием другого имени, работает нормально, потому что это выборка, подобная x.f
:
scala> implicit class R(val s: String) { object charAt { def apply(n: Int, c: Char): Char = Try(s.charAt(n)).getOrElse(c) } }
defined class R
scala> "abc".charAt(3, 'z')
^
error: too many arguments (2) for method charAt: (x$1: Int)Char
scala> implicit class R(val s: String) { object charAt2 { def apply(n: Int, c: Char): Char = Try(s.charAt(n)).getOrElse(c) } }
defined class R
scala> "abc".charAt2(3, 'z')
res2: Char = z
Спасибо первоначальному автору, спрашивающему об этом; вопрос был слишком быстро отклонен как дубликат, который не был; это вдохновило на сообщение об ошибке .