Это очень хороший вопрос! Во-первых, позвольте мне заверить вас, что вы можете безопасно указать тип возвращаемого значения.
Теперь давайте посмотрим на это ... да, если сделать вывод, Scala выводит java.lang.String
, а не просто String
. Итак, если вы посмотрите «String» в ScalaDoc , вы не найдете ничего, что, по-видимому, также указывает на то, что это не класс 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
, и вот оно!
type String = String
Это означает, что String
- это псевдоним для java.lang.String
(который был импортирован ранее). Это похоже на циклическую ссылку, но если вы проверите source , вы увидите, что он определен с полным путем:
type String = java.lang.String
Далее, вы можете спросить почему? Ну, я понятия не имею, но я подозреваю, что такой важный класс должен быть немного менее зависимым от JVM.