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.lang
findjava.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
这意味着String
是java.lang.String
一个别名 (之前导入的)。 这看起来像循环引用,但是如果你检查源代码 ,你会发现它是用完整path定义的:
type String = java.lang.String
接下来,你可能想问为什么? 那么,我没有任何想法,但是我猜想是让这样一个重要的类对Java虚拟机的依赖程度减less一点。