Странность оператора Скала - PullRequest
14 голосов
/ 11 марта 2012

Когда я вызываю + on 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.+
                ^

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

Ответы [ 2 ]

20 голосов
/ 11 марта 2012

В Scala 2.9 и ранее, 2. интерпретируется как 2.0, поэтому неоднозначная точка обозначает литерал с плавающей точкой. Вы явно вызываете метод, используя синтаксис (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
16 голосов
/ 11 марта 2012

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

scala> 2.
res0: Double = 2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...