Answers:
发生了一些事情。
首先,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
是一个值类,因此编译器将尽可能避免包装整数。
new DurationInt(20).seconds()
只要知道二十秒的可读性,二十秒的可读性要高得多)
seconds
方法是在没有parens的情况下定义的,因此使用parens进行调用是错误的。
20.seconds()
Scala 编写代码,只是建议编译器以这种方式翻译该调用。值得指出的是,在这种情况下,如果相应的方法没有参数列表,则Scala 要求您省略parens。