C'est une très bonne question! Tout d'abord, permettez-moi de vous assurer que vous pouvez spécifier le type de retour.
Maintenant, regardons vers elle... oui, lorsqu'il est laissé à l'inférence, la Scala en déduit java.lang.String
, au lieu de simplement en String
. Donc, si vous cherchez "String" dans le ScalaDoc, vous ne trouverez rien, ce qui semble indiquer qu'il n'est pas un Scala classe. Eh bien, il doit venir de quelque part, si.
Considérons ce que Scala importations par défaut. Vous pouvez trouver par vous-même sur le REPL:
scala> :imports
1) import java.lang._ (155 types, 160 terms)
2) import scala._ (801 types, 809 terms)
3) import scala.Predef._ (16 types, 167 terms, 96 are implicit)
Les deux premiers sont des packages -- et, en effet, String
peut être trouvé sur java.lang
! Est qu'il, alors? Nous allons vérifier par l'instanciation de quelque chose d'autre de ce package:
scala> val s: StringBuffer = new StringBuffer
s: java.lang.StringBuffer =
scala> val s: String = new String
s: String = ""
Donc, ça ne semble pas être elle. Maintenant, il ne peut pas être à l'intérieur de l' scala
paquet, ou il aurait été trouvé lors de la recherche sur la ScalaDoc. Donc, nous allons regarder à l'intérieur d' scala.Predef
, et elle est là!
type String = String
Cela signifie que String
est un alias pour java.lang.String
(qui a été importé précédemment). Qui ressemble à un mouvement cyclique de référence, mais si vous vérifiez la source, vous verrez qu'il est défini par le chemin complet:
type String = java.lang.String
Ensuite, vous voudrez peut-être demander pourquoi? Eh bien, je n'ai pas la moindre idée, mais je suppose que c'est pour faire de cette importante classe un peu moins dépendante de la JVM.