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

时间:2012-01-30 14:39:28

标签: java scala expression

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

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

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

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

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

返回的类型是:字符串

为何与众不同?

2 个答案:

答案 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字符串。