Scala возвращает разные типы для очень похожих выражений - PullRequest
5 голосов
/ 30 января 2012

Если я вычисляю следующее выражение в Scala REPL:

scala> "1" + 1
res0: java.lang.String = 11

, возвращается тип: java.lang.String .

Если я оцениваю подобноевыражение:

scala> 1 + "1"
res1: String = 11

Возвращаемый тип: Строка .

Почему разница?

Ответы [ 2 ]

14 голосов
/ 30 января 2012

Разницы нет, однако это тоже не ошибка. В этом случае:

"1" + 1

вы используете встроенную функцию Java для объединения чего-либо в строку. В конце концов, многие люди конвертируют числа в строки, используя следующую «идиому»:

String s = "" + 5;

Он также работает в Scala и приводит к java.lang.String - так же, как в Java.

С другой стороны:

1 + "1"

немного сложнее. Это переведено на:

1.+("1")

, а метод +() взят из метода Int.+, расположенного в Int.scala:

final class Int extends AnyVal {
    //....
    def +(x: String): String = sys.error("stub")

String в этом контексте определено в Predef.scala:

type String        = java.lang.String

, который является источником типа " разница ". Как видите, обе строки на самом деле одного типа.

2 голосов
/ 30 января 2012

"1"+1 вызывает оператор java.lang.String +, 1+"1" вызывает оператор +, определенный средой выполнения scala (не может найти его прямо сейчас), поэтому он возвращает строку scala.

...