型Sから型Tへの暗黙の変換はS => Tという型のimplicit値や、その型に一致するimplicitメソッドで定義されます。
暗黙の変換は2つの状況で適用されます。
- もし式
eが型Sであり、Sは式の期待する型Tに適合しない場合 - 型
Sのeを使う表記e.mがあって、セレクターmがSのメンバーではない場合
最初のケースでは、eを渡せて、戻り値の型がTに適合するような変換cを検索します。 2つ目のケースでは、eを渡せて、戻り値がmというメンバーを持つような変換cを検索します。
implicitなメソッドList[A] => Ordered[List[A]]とInt => Ordered[Int]がスコープの中にあれば、List[Int]型の2つのリストにおける以下の処理は正当なものになります。
List(1, 2, 3) <= List(4, 5) implicitなメソッドInt => Ordered[Int]はscala.Predef.intWrapperを通じて自動的に提供されます。implicitなメソッドの例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]] { //replace with a more useful implementation def compare(that: List[A]): Int = 1 } 暗黙にインポートされているオブジェクトscala.Predefは、頻繁に使われる型(例えばscala.collection.immutable.MapはMapと別名づけられます)とメソッド(例えばassert)といくつかの暗黙の型変換を宣言しています。
例えば、java.lang.Integerを受け取るようなJavaのメソッドを呼び出す時、自由にscala.Intを代わりに渡すことができます。それはPredefオブジェクトが以下の暗黙の変換を含んでいるからです。
import scala.language.implicitConversions implicit def int2Integer(x: Int): Integer = Integer.valueOf(x) 暗黙の変換は見境なく使われると落とし穴になり得るため、暗黙の変換の定義をコンパイルしている時にコンパイラは警告を出します。
警告をオフにするには、次のいずれかの措置を講じてください。
- 暗黙の変換定義のスコープに
scala.language.implicitConversionsをインポートする。 - コンパイラを
-language:implicitConversionsをつけて起動する
コンパイラにより変換が適用された時、警告は出ません。