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。