型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
をつけて起動する
コンパイラにより変換が適用された時、警告は出ません。