Tour of Scala

Неявные Преобразования

Language

Неявные преобразование типа 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: