次のコンパイル方法:
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
**として書き換えます。
*これは大まかに言っています。 seconds
メソッドにはパラメーターリストがないため、20.seconds()
は実際に無効です。したがって、メソッド呼び出しでは括弧mustを省略する必要があります。
**実際、DurationInt
は値クラスであるため、これは完全に真実ではありません。したがって、コンパイラーは、可能であれば整数のラップを回避します。
そこで行われている「魔法」は「暗黙の変換」と呼ばれます。暗黙的な変換をインポートしており、その一部はInt(およびDouble)からDurationへの変換を処理します。それがあなたが扱っていることです。