docs/_docs/reference/changed-features/implicit-conversions.md
An implicit conversion, also called view, is a conversion that is applied by the compiler in several situations:
e of type T is encountered, but the compiler
needs an expression of type S.e.m where e has type T but T defines no
member m is encountered.In those cases, the compiler looks in the implicit scope for a
conversion that can convert an expression of type T to an expression
of type S (or to a type that defines a member m in the second
case).
This conversion can be either:
implicit def of type T => S or (=> T) => Sscala.Conversion[T, S]Defining an implicit conversion will emit a warning unless the import
scala.language.implicitConversions is in scope, or the flag
-language:implicitConversions is given to the compiler.
The first example is taken from scala.Predef.
Thanks to this implicit conversion, it is possible to pass a
scala.Int
to a Java method that expects a java.lang.Integer
import scala.language.implicitConversions
implicit def int2Integer(x: Int): java.lang.Integer =
x.asInstanceOf[java.lang.Integer]
The second example shows how to use Conversion to define an
Ordering for an arbitrary type, given existing Orderings for other
types:
import scala.language.implicitConversions
implicit def ordT[T, S](
implicit conv: Conversion[T, S],
ordS: Ordering[S]
): Ordering[T] =
// `ordS` compares values of type `S`, but we can convert from `T` to `S`
(x: T, y: T) => ordS.compare(x, y)
class A(val x: Int) // The type for which we want an `Ordering`
// Convert `A` to a type for which an `Ordering` is available:
implicit val AToInt: Conversion[A, Int] = _.x
implicitly[Ordering[Int]] // Ok, exists in the standard library
implicitly[Ordering[A]] // Ok, will use the implicit conversion from
// `A` to `Int` and the `Ordering` for `Int`.