Scala String vs java.lang.String - вывод типа - PullRequest
40 голосов
/ 03 июля 2011

В 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.Будет ли это иметь практические последствия, или я могу безопасно не указывать тип возврата?

1 Ответ

54 голосов
/ 03 июля 2011

Это очень хороший вопрос! Во-первых, позвольте мне заверить вас, что вы можете безопасно указать тип возвращаемого значения.

Теперь давайте посмотрим на это ... да, если сделать вывод, 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.

...