Tour of Scala

暗黙の変換

Language

Sから型Tへの暗黙の変換はS => Tという型のimplicit値や、その型に一致するimplicitメソッドで定義されます。

暗黙の変換は2つの状況で適用されます。

  • もし式eが型Sであり、Sは式の期待する型Tに適合しない場合
  • Seを使う表記e.mがあって、セレクターmSのメンバーではない場合

最初のケースでは、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.MapMapと別名づけられます)とメソッド(例えば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をつけて起動する

コンパイラにより変換が適用された時、警告は出ません。

Contributors to this page: