2012-03-11 13 views
14

Kiedy wywołuję + 2, otrzymuję oddzwonienie, ale gdy zostanie ono wykonane przy użyciu jawnego wywołania metody, otrzymam Double zamiast tego.Osobliwość operatora Scala

scala> 2+2 
res1: Int = 4 

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

Wygląda na to, że +() jest wywoływane na niejawnym przekonwertowanym Int do 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.+ 
       ^

Dlaczego tak się dzieje?

+0

zgodność Java: -/ – soc

Odpowiedz

16

Powodem nie jest jawne wywołanie metody - pisząc 2.+ ty określającą dwukrotnie na lewej stronie, a następnie wywołanie operatora dodawania na nim:

scala> 2. 
res0: Double = 2.0 
+0

To dziwne, zadowolony, że depracate go. – Lukasz

20

w Scala 2.9 i wcześniej, 2. jest interpretowany jako 2.0 więc niejednoznaczna kropka oznacza literał zmiennoprzecinkowy. Można jawnie wywołać metodę, używając składni (2).+(2).

Niejednoznaczne składnia zmiennoprzecinkowe będą jednak przestarzała w 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

BTW, dlaczego istnieją trzy ostrzeżenia? –

+0

Nie wiem. Ale oczywiście nadal jest migawką (i samokompilowaną). – Debilski

+0

Chyba jest to problem z repliką. – Debilski

Powiązane problemy