Scalastring与java.lang.String – types推断

在REPL中,我定义了一个函数。 请注意返回types。

scala> def next(i: List[String]) = i.map {"0" + _} ::: i.reverse.map {"1" + _} next: (i: List[String])List[java.lang.String] 

如果我指定返回types为String

 scala> def next(i: List[String]): List[String] = i.map {"0" + _} ::: i.reverse.map {"1" + _} next: (i: List[String])List[String] 

为什么区别? 我也可以指定返回types为List [Any],所以我猜string只是一个包装到java.lang.String的超types。 这会有什么实际的影响,或者我可以安全地不指定返回types?

这个问题问得好! 首先,让我向您保证,您可以安全地指定返回types。

现在,让我们来看看它…是的,当推断时,Scala推断java.lang.String ,而不是String 。 所以,如果你在ScalaDoc中查找“String”,你不会发现任何东西,这似乎表明它不是一个Scala类。 那么,它必须来自某个地方。

让我们来考虑Scala默认导入的内容。 你可以在REPL上自己find它:

 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) 

前两个是包 – 实际上,可以在java.langfindjava.lang ! 那是吗? 让我们通过从该包中实例化其他东西来检查:

 scala> val s: StringBuffer = new StringBuffer s: java.lang.StringBuffer = scala> val s: String = new String s: String = "" 

所以,这似乎不是。 现在,它不能在scala包内,或者在ScalaDoc上查找。 所以让我们来看看scala.Predef ,在那里!

 type String = String 

这意味着Stringjava.lang.String一个别名 (之前导入的)。 这看起来像循环引用,但是如果你检查源代码 ,你会发现它是用完整path定义的:

 type String = java.lang.String 

接下来,你可能想问为什么? 那么,我没有任何想法,但是我猜想是让这样一个重要的类对Java虚拟机的依赖程度减less一点。