以下はどのようにコンパイルされますか:
import scala.concurrent.duration._
val time = 20 seconds
ここで実際に何が起こっているのですか?
いくつかのことが起こっています。
まず、Scala では、多くのメソッド呼び出しからドットと括弧を省略できるため、*20 seconds
と同等20.seconds()
です。
次に、「暗黙の変換」が適用されます。20
は であり、メソッドInt
をInt
持たないため、コンパイラは、メソッド呼び出しのスコープによって制限された検索で、を受け取り、メソッドを持つものを返すseconds
暗黙的な変換を検索します。Int
seconds
DurationIntをスコープにインポートしました。DurationInt
はパラメーターを持つ暗黙的なクラスであるため、Int
そのコンストラクターは暗黙的Int => DurationInt
な変換を定義します。DurationInt
メソッドを持っているseconds
ため、すべての検索条件を満たします。したがって、コンパイラは呼び出しをnew DurationInt(20).seconds
** に書き換えます。
※ざっくりとした意味です。メソッドにはパラメーター リストがなく、メソッド呼び出しでは括弧を省略する必要20.seconds()
があるため、実際には無効です。seconds
**実際には、 は値クラスであるため、これは正しくありませんDurationInt
。そのため、コンパイラは可能であれば整数のラップを回避します。
そこで起こっている「魔法」は「暗黙の変換」と呼ばれます。暗黙的な変換をインポートしていますが、その一部は Int (および Double) から Duration への変換を処理します。それがあなたが扱っているものです。