Неявные преобразование типа S
к типу T
задается неявным значением функционального типа S =>T
, или неявным методом, который способен преобразовывать к значению требуемого типа.
Неявное преобразование применяются в двух случаях:
- Если выражение
e
типаS
не подходит под ожидаемый тип выраженияT
. - Если мы выбирая член
e.m
, гдеe
является представителем типаS
, при этом выбранное имяm
не найдено среди доступных селекторов принадлежащих типуS
.
В первом случае выполняется поиск приведения c
, которое можно применить к e
чтоб тип результата стал соответствовать ожидаемому T
.
Во втором случае выполняется поиск преобразования c
, которое применимо к e
и результат которого бы содержал член с именем m
.
Если неявный метод List[A] => Ordered[List[A]]
находится в области видимости, также как и неявный метод Int => Ordered[Int]
, то следующая операция с двумя списками типа List[Int]
является допустимой:
List(1, 2, 3) <= List(4, 5)
Неявный метод Int => Ordered[Int]
предоставляется автоматически через scala.Predef.intWrapper
. Ниже приведен пример объявления неявного метода List[A] => Ordered[List[A]]
.
import scala.language.implicitConversions
implicit def list2ordered[A](x: List[A])
(implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =
new Ordered[List[A]] {
//заменить на более полезную реализацию
def compare(that: List[A]): Int = 1
}
Неявно импортируемый объект scala.Predef
объявляет ряд псевдонимов для часто используемым типов (например, scala.collection.immutable.Map
использует псевдоним Map
) и методов (например, assert
), а также делает доступным целую серию неявных преобразований.
Например, при вызове Java метода, который ожидает java.lang.Integer
, вместо него вы можете свободно использовать scala.Int
. Потому что Predef включает в себя следующие неявные преобразования:
import scala.language.implicitConversions
implicit def int2Integer(x: Int) =
java.lang.Integer.valueOf(x)
Компилятор предупреждает при компиляции об обнаружении неявных преобразований, т.к. неявные преобразования могут иметь разные подводные камни (особенно если использовать их без разбора).
Чтоб отключить предупреждения выполните одно из следующих действий:
- Импортируйте
scala.language.implicitConversions
в области видимости, где объявлены неявные преобразования. - Вызывайте компилятор с ключом
-language:implicitConversions
.
В таком случае при преобразовании компилятором не будет выдаваться никаких предупреждений.
Contributors to this page:
Contents
- Введение
- Основы
- Единобразие типов
- Классы
- Значения Параметров По умолчанию
- Именованные Аргументы
- Трейты
- Кортежи
- Композиция классов с трейтами
- Функции Высшего Порядка
- Вложенные Методы
- Множественные списки параметров (Каррирование)
- Классы Образцы
- Сопоставление с примером
- Объекты Одиночки
- Регулярные Выражения
- Объект Экстрактор
- Сложные for-выражения
- Обобщенные Классы
- Вариантность
- Верхнее Ограничение Типа
- Нижнее Ограничение Типа
- Внутренние классы
- Члены Абстрактного Типа
- Составные Типы
- Самоописываемые типы
- Неявные Параметры
- Неявные Преобразования
- Полиморфные методы
- Выведение Типа
- Операторы
- Вызов по имени
- Аннотации
- Пакеты и Импорт
- Объекты Пакета