Неявные преобразования — это мощная функция Scala, применяемая в двух распространенных вариантах:
- разрешить пользователям предоставлять аргумент одного типа так, как если бы это был другой тип, чтобы избежать шаблонного.
- в Scala 2 для предоставления дополнительных членов запечатанным классам (заменены методами расширения в Scala 3).
Детальный разбор
В Scala 2 неявное преобразование из типа S
в тип T
определяется либо неявным классом T
с одним параметром типа S
, неявным значением, которое имеет тип функции S => T
, либо неявным методом, преобразуемым в значение этого типа.
В Scala 3 неявное преобразование из типа S
в тип T
определяется экземпляром given
, который имеет тип scala.Conversion[S, T]
. Для совместимости со Scala 2 их также можно определить неявным методом (подробнее читайте во вкладке Scala 2).
Неявные преобразования применяются в двух случаях:
- Если выражение
e
имеет типS
иS
не соответствует ожидаемому типу выраженияT
. - При выборе
e.m
, гдеe
типаS
, если селекторm
не указывает на элементS
.
В первом случае ищется конверсия c
, применимая к e
и тип результата которой соответствует T
.
Примером является передача scala.Int
, например x
, методу, который ожидает scala.Long
. В этом случае вставляется неявное преобразование Int.int2long(x)
.
Во втором случае ищется преобразование c
, применимое к e
и результат которого содержит элемент с именем m
.
Примером является сравнение двух строк "foo" < "bar"
. В этом случае String
не имеет члена <
, поэтому вставляется неявное преобразование Predef.augmentString("foo") < "bar"
(scala.Predef
автоматически импортируется во все программы Scala).
Дополнительная литература: Неявные преобразования (в книге Scala).