这个问题问得好!首先,我向您保证您可以安全地指定返回类型。
现在,让我们研究一下......是的,当留给推断时,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 的依赖。