以下如何编译:
import scala.concurrent.duration._
val time = 20 seconds
这里到底发生了什么?
有几件事正在发生。
首先,Scala 允许在许多方法调用中省略点和括号,因此20 seconds
等价于20.seconds()
*.
其次,应用“隐式转换”。由于20
is anInt
并且Int
没有seconds
方法,因此编译器会搜索一个隐式转换,该转换接受 anInt
并返回具有方法的内容seconds
,搜索受方法调用范围的限制。
您已将DurationInt导入您的范围。由于DurationInt
是一个带Int
参数的隐式类,它的构造函数定义了一个隐式Int => DurationInt
转换。DurationInt
有一个seconds
方法,所以它满足所有的搜索条件。因此,编译器将您的调用重写为new DurationInt(20).seconds
**。
*我的意思是松散的。20.seconds()
实际上是无效的,因为该seconds
方法没有参数列表,因此必须在方法调用上省略括号。
**实际上,这并不完全正确,因为DurationInt
它是一个值类,因此编译器会尽可能避免包装整数。
那里发生的“魔术”称为“隐式转换”。您正在导入隐式转换,其中一些处理 Int(和 Double)到 Duration 之间的转换。这就是你正在处理的事情。