在scala中将字符串添加到字符串中

sc_*_*ray 2 types casting scala return-type return-value

我在理解以下几段scala代码背后的基本原理时遇到了一些麻烦:

我们都知道REPL中1 + 1 = 2.

scala> 1 + 1
res0: Int = 2
Run Code Online (Sandbox Code Playgroud)

如果我输入"Abc"+"Def",我应该在REPL中输入"AbcDef".

scala> "Abc" + "Def"
res6: java.lang.String = AbcDef
Run Code Online (Sandbox Code Playgroud)

现在假设我在String"Abc"上调用+方法并将"Def"作为参数传递:

scala> "Abc".+("Def")
res7: java.lang.String = AbcDef
Run Code Online (Sandbox Code Playgroud)

根据相同的理由,为什么像1. +(1)这样的东西会返回一个双2.0?

scala> 1.+(1)
res1: Double = 2.0
Run Code Online (Sandbox Code Playgroud)

另外,为什么将参数"1"作为参数传递给"1.01",如下所示:

scala> 1.+("1")
res9: String = 1.01
Run Code Online (Sandbox Code Playgroud)

为什么返回的结果是String而不是"1"的努力转换成调用者类型?

谢谢

Dan*_*ral 10

如果你在Scala 2.10.0上试试,你会得到一个答案的线索:

scala> 1.+(1)
<console>:1: warning: This lexical syntax is deprecated.  From scala 2.11,
             a dot will only be considered part of a number if it is immediately
             followed by a digit.
       1.+(1)
       ^
Run Code Online (Sandbox Code Playgroud)

简单地说,在Scala中1.是有效Double的(因为它在Java中),因此Scala实际上是这样做的:

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

也就是说,Double在(冗余)括号内包含的表达式中加上a.

对于后者,Scala遵循Java约定,任何事物都会添加到String结果中String,反之亦然.