Scala String 与 java.lang.String - 类型推断

2024-03-03

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

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

如果我将返回类型指定为 String

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

为什么有区别?我还可以将返回类型指定为 List[Any],所以我猜 String 只是 java.lang.String 的包装超类型。这会产生任何实际影响吗?或者我可以安全地不指定返回类型吗?


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

现在,让我们研究一下......是的,当留给推断时,Scala 推断java.lang.String,而不仅仅是String。因此,如果您在ScalaDoc http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html,你不会找到任何东西,这似乎表明它也不是一个 Scala 类。嗯,但它必须来自某个地方。

让我们考虑一下 Scala 默认导入的内容。你可以在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)

前两个是包——事实上,String可以找到java.lang!那么是这样吗?让我们通过实例化该包中的其他内容来进行检查:

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

scala> val s: String = new String
s: String = ""

所以,看来不是这样的。现在,它不能在scala包,或者在查找 ScalaDoc 时会找到它。那么让我们看看里面scala.Predef http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.Predef%24,就在那里!

type String = String

这意味着String is an alias for java.lang.String(之前已导入)。这看起来像是一个循环引用,但如果你检查source https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src//library/scala/Predef.scala#L1,你会看到它是用完整路径定义的:

type String        = java.lang.String

接下来,你可能想问why?好吧,我不知道,但我怀疑这是为了让这么重要的类少一点对 JVM 的依赖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala String 与 java.lang.String - 类型推断 的相关文章

随机推荐