如果我在Scala REPL中评估以下表达式:
scala> "1" + 1
res0: java.lang.String = 11
返回的类型是: java.lang.String 。
如果我评估这个相似的表达方式:
scala> 1 + "1"
res1: String = 11
返回的类型是:字符串。
为何与众不同?
答案 0 :(得分:14)
没有区别,但它也不是一个错误。在这种情况下:
"1" + 1
您正在使用Java的内置功能将任何内容连接到String中。毕竟,许多人使用以下“成语”将数字转换为字符串:
String s = "" + 5;
它也适用于Scala,结果为java.lang.String
- 与Java相同。
另一方面:
1 + "1"
有点复杂。这被翻译成:
1.+("1")
并且+()
方法取自位于Int.+
的{{1}}方法:
Int.scala
此上下文中的final class Int extends AnyVal {
//....
def +(x: String): String = sys.error("stub")
在String
:
Predef.scala
是“差异”类型的来源。正如您所看到的,两个字符串实际上都是相同的类型。
答案 1 :(得分:2)
"1"+1
调用java.lang.String的operator +,1+"1"
调用scala运行时定义的运算符+(现在找不到它),因此返回一个scala字符串。