2012-03-11 15 views
14

Cuando invoco + en 2 obtengo un Int atrás, pero cuando se hace usando el método explícito, llamo I get Double en su lugar.Scala operator oddity

scala> 2+2 
res1: Int = 4 

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

Parece que. +() Se invoca implícitamente convertida en doble.

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.+ 
       ^

¿Por qué es así?

+0

Java compatibilidad: -/ – soc

Respuesta

16

La razón no está en llamada al método explícito - escribiendo 2.+ que especifica doble en el lado izquierdo y luego llamar operador de suma en él:

scala> 2. 
res0: Double = 2.0 
+0

Eso es extraño, feliz de que depracate ella. – Lukasz

20

En Scala 2.9 y antes, 2. se interpreta como 2.0 entonces el punto ambiguo denota un literal flotante. Llamarás explícitamente al método utilizando la sintaxis (2).+(2).

La sintaxis de punto flotante ambigua sin embargo quedará obsoleta en 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 
+1

Por cierto, ¿por qué hay tres advertencias? –

+0

No lo sé. Pero, por supuesto, sigue siendo una instantánea (y una compilada por uno mismo). – Debilski

+0

Supongo que es un problema de repl. – Debilski