2012-03-11 18 views
14

+ 2'yi çağırdığımda Int'e geri döndüğümde, ancak açık yöntem kullanılarak yapılan arama bittiğinde, Double olsun.Scala operatörü oddity

scala> 2+2 
res1: Int = 4 

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

Öyle görünüyor ki, örtük dönüştürülmüş Int'den Double'e (+) dönüştürülür.

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

Neden böyle?

+0

Java uyumluluğu: - garip/ – soc

cevap

16

nedeni açık yöntem çağrısında değildir - Üzerinde toplama operatörünü arayarak o zaman sol tarafta Çift belirterek 2.+ yazıp tarafından:

Scala 2.9 içinde ve öncesinde
scala> 2. 
res0: Double = 2.0 
+0

, mutluluk onlar bunu depracate. – Lukasz

20

, 2.2.0 olarak yorumlanır bu yüzden belirsiz nokta bir kayan nokta anlamına gelir. Yöntemi, (2).+(2) sözdizimini kullanarak açıkça çağırırsınız.

belirsiz kayan nokta sözdizimi ancak 2.10'da kaldırılacaktır:

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, neden üç uyarı var? –

+0

Bilmiyorum. Ama elbette bu hala bir enstantane (ve kendini derlenmiş olan). – Debilski

+0

Sanırım bu bir sorun. – Debilski