为什么它评估为字符串?

zer*_*ing 0 scala

我有以下表达式:

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

结果我得到了

1c
Run Code Online (Sandbox Code Playgroud)

我想,因为编译器将表达式转换为:

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

对我来说它根本不是逻辑,我期待一个异常,因为表达式的第一个参数是a Int,它决定了结果类型.

如果它会反过来像

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

然后我同意,该值应该是一个字符串.

为什么编译器不在第一个表达式上抛出异常?

ymo*_*nad 7

这是因为scala.Int有成员方法+(x:String):String

1 + "c"只是一个语法糖 1.+("c"),它是用参数调用+成员方法.1"c"

来自:http://docs.scala-lang.org/style/method-invocation.html#infix-notation

Scala有一个特殊的无标点语法,用于调用带有一个参数的方法.许多Scala程序员将这种表示法用于符号命名方法

  • 甚至它*没有*那个方法,然后[隐式转换为`any2stringadd`](http://scala-lang.org/api/current/index.html#scala.Predef$@any2stringadd [A] extendsAnyVal)将生效. (2认同)