以下代码如何编译:
import scala.concurrent.duration._
val time = 20 seconds
这里到底发生了什么?
最佳答案
有一些事情正在发生。
首先,Scala 允许在许多方法调用中省略点和括号,因此 20 秒
相当于 20.seconds()
*。
其次,应用“隐式转换”。由于 20
是一个 Int
并且 Int
没有 seconds
方法,编译器会搜索一个隐式转换,该转换需要Int
并返回确实具有一个 seconds
方法的内容,搜索受到方法调用范围的限制。
您已导入DurationInt进入你的范围。由于 DurationInt
是一个带有 Int
参数的隐式类,因此其构造函数定义了隐式 Int => DurationInt
转换。 DurationInt
有一个 seconds
方法,因此它满足所有搜索条件。因此,编译器会将您的调用重写为 new DurationInt(20).seconds
**。
*我的意思是松散的。 20.seconds()
实际上是无效的,因为 seconds
方法没有参数列表,因此在方法调用时必须省略括号。
**实际上,这并不完全正确,因为 DurationInt
是一个值类,因此编译器将尽可能避免包装整数。
关于scala - '20 seconds' 在 Scala 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104536/