40 votes

Scala String vs java.lang.String - inférence de type

Dans le REPL, je définis une fonction. Notez 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écifie le type de retour sous forme de chaîne

 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 spécifier le type de retour sous la forme List [Any]. Par conséquent, String n'est qu'un type de super emballage pour java.lang.String. Cela aura-t-il des implications pratiques ou puis-je ne pas spécifier le type de retour en toute sécurité?

56voto

Daniel C. Sobral Points 159554

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X