Відповіді:
Дещо відбувається.
По-перше, 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
метод визначений без паролів, тому викликати його паролями - це помилка.
20.seconds()
в Scala, лише що компілятор перекладає виклик саме так. Варто зазначити, що Scala вимагає опустити паролі, якщо відповідний метод не має списку параметрів, як у цьому випадку.
"Магія", що там відбувається, називається "неявна конверсія". Ви імпортуєте неявні конверсії, а деякі з них обробляють перетворення між Int (і Double) у Duration. Ось з чим ви маєте справу.
import scala.concurrent.duration._
вирішує, 20 seconds
а насправді імпорт DurationConversions
риси не робить? EDIT : Щойно зрозумів, що вони насправді імпортують DurationInt
. Я здогадуюсь це тому, що ви не можете імпортувати фактичну ознаку? Лише конкретна реалізація риси?