Scala странность оператора

Когда я вызываю + на 2, я получаю Int обратно, но когда его делается с использованием явного вызова метода, я получаю Double вместо.

scala> 2+2
res1: Int = 4

scala> 2.+(2)
res2: Double = 4.0

Кажется, что. +() вызывается в неявном преобразованном Int в Double.

scala> 2.+
<console>:16: error: ambiguous reference to overloaded definition,
both method + in class Double of type (x: Char)Double
and  method + in class Double of type (x: Short)Double
match expected type ?
              2.+
                ^

Почему это так?

Ответ 1

Причина не в явном вызове метода - написав 2.+, указав Double на левой стороне, а затем вызывая на нем оператор сложения:

scala> 2.
res0: Double = 2.0

Ответ 2

В Scala 2.9 и до, 2. интерпретируется как 2.0, поэтому двусмысленная точка обозначает плавающий литерал. Youd явно вызывает метод, используя синтаксис (2).+(2).

Неоднозначный синтаксис с плавающей запятой, однако, будет устаревшим в 2.10:

scala> 2.+(2)
<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.
       2.+(2)
       ^
<console>:2: 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.
              2.+(2)
              ^
<console>:8: 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.
              2.+(2)
              ^
res1: Double = 4.0