Scala Chaîne vs java.lang.Chaîne - l'inférence de type
Dans le REPL, je définir une fonction. Remarque le type de retour.
scala> def next(i: List[String]) = i.map {"0" + _} ::: i.reverse.map {"1" + _}
next: (i: List[String])List[java.lang.String]
Et si je spécifier le type de retour en tant que Chaîne de
scala> def next(i: List[String]): List[String] = i.map {"0" + _} ::: i.reverse.map {"1" + _}
next: (i: List[String])List[String]
Pourquoi la différence? Je peux aussi préciser le type de retour de Liste en tant que[Tout], donc je suppose que la Chaîne est juste un wrapper supertype de java.lang.Chaîne de caractères. Sera-ce de ont aucune incidence pratique ou puis-je sans risque de ne pas spécifier le type de retour?
Vous devez vous connecter pour publier un commentaire.
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 simplementString
. 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 quelles Scala importations par défaut. Vous pouvez trouver par vous-même sur le REPL:
Les deux premiers sont des packages -- et, en effet,
String
peut être trouvé surjava.lang
! Est qu'il, alors? Nous allons vérifier par l'instanciation d'autre chose que du package:Donc, qui ne semble pas être elle. Maintenant, il ne peut pas être à l'intérieur de la
scala
paquet, ou il aurait été trouvé lors de la recherche sur la ScalaDoc. Donc, nous allons regarder à l'intérieur descala.Predef
, et ça y est!Qui signifie
String
est un alias pourjava.lang.String
(qui a été importé précédemment). Qui ressemble à un mouvement cyclique de référence, mais si vous vérifiez les source, vous verrez qu'il est défini avec le chemin d'accès complet: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.