Неявные преобразования — это мощная функция 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).
Contributors to this page:
Contents
- Введение
- Основы
- Единобразие типов
- Классы
- Значения Параметров По умолчанию
- Именованные Аргументы
- Трейты
- Кортежи
- Композиция классов с трейтами
- Функции Высшего Порядка
- Вложенные Методы
- Множественные списки параметров (Каррирование)
- Классы Образцы
- Сопоставление с примером
- Объекты Одиночки
- Регулярные Выражения
- Объект Экстрактор
- Сложные for-выражения
- Обобщенные Классы
- Вариантность
- Верхнее Ограничение Типа
- Нижнее Ограничение Типа
- Внутренние классы
- Члены Абстрактного Типа
- Составные Типы
- Самоописываемые типы
- Контекстные параметры, также известные, как неявные параметры
- Неявные Преобразования
- Полиморфные методы
- Выведение Типа
- Операторы
- Вызов по имени
- Аннотации
- Пакеты и Импорт
- Объекты Пакета