Scala为非常相似的表达式返回不同的类型

Pri*_*osK 5 java expression scala

如果我在Scala REPL中评估以下表达式:

scala> "1" + 1
res0: java.lang.String = 11
Run Code Online (Sandbox Code Playgroud)

返回的类型是:java.lang.String.

如果我评估这个相似的表达式:

scala> 1 + "1"
res1: String = 11
Run Code Online (Sandbox Code Playgroud)

返回的类型是:String.

为什么不同?

Tom*_*icz 14

没有区别,但它也不是一个bug.在这种情况下:

"1" + 1
Run Code Online (Sandbox Code Playgroud)

您正在使用Java的内置功能将任何内容连接到String中.毕竟,许多人使用以下"成语"将数字转换为字符串:

String s = "" + 5;
Run Code Online (Sandbox Code Playgroud)

它也适用于Scala,结果与java.lang.StringJava相同.

另一方面:

1 + "1"
Run Code Online (Sandbox Code Playgroud)

有点复杂.这被翻译成:

1.+("1")
Run Code Online (Sandbox Code Playgroud)

+()方法取自Int.+位于Int.scala以下方法的方法:

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

String在这方面的定义中Predef.scala:

type String        = java.lang.String
Run Code Online (Sandbox Code Playgroud)

这是" 差异 " 类型的来源.正如您所看到的,两个字符串实际上是相同的类型.