Comment les éléments suivants sont-ils compilés:
import scala.concurrent.duration._
val time = 20 seconds
Qu'est-ce qui se passe réellement ici?
Il y a quelques choses qui se passent.
Premièrement, Scala permet aux points et aux parenthèses d'être omis de nombreux appels de méthode, de sorte que 20 seconds
Équivaut à 20.seconds()
*.
Deuxièmement, une "conversion implicite" est appliquée. Puisque 20
Est une méthode Int
et que Int
ne possède pas de méthode seconds
, le compilateur recherche une conversion implicite prenant un Int
et renvoie quelque chose qui a une méthode seconds
, la recherche étant contrainte par la portée de votre appel de méthode.
Vous avez importé DurationInt dans votre scope. Puisque DurationInt
est une classe implicite avec un paramètre Int
, son constructeur définit une conversion implicite Int => DurationInt
. DurationInt
a une méthode seconds
et satisfait donc tous les critères de recherche. Par conséquent, le compilateur réécrit votre appel en tant que new DurationInt(20).seconds
**.
* Je veux dire cela vaguement. 20.seconds()
est en réalité invalide car la méthode seconds
ne contient aucune liste de paramètres et par conséquent les parenthèses doivent être omis appel de méthode.
** En réalité, ce n'est pas tout à fait vrai parce que DurationInt
est une classe de valeur, aussi le compilateur évitera-t-il, si possible, d'emballer le entier.
La "magie" qui s'y passe s'appelle "conversion implicite". Vous importez les conversions implicites et certaines d'entre elles gèrent la conversion entre Int (et Double) en Durée. C'est ce que vous avez à faire.