2012-03-11 36 views
14

Khi tôi gọi + on 2, tôi nhận được một Int, nhưng khi nó được thực hiện bằng cách sử dụng phương thức tường minh gọi tôi nhận được Double thay thế.Scala operator oddity

scala> 2+2 
res1: Int = 4 

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

Dường như. +() Được gọi trên Int được chuyển đổi thành Int thành 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.+ 
       ^

Tại sao vậy?

+0

Java tương thích: -/ – soc

Trả lời

16

Lý do không có trong phương pháp gọi rõ ràng - bằng cách viết 2.+ bạn xác định đúp vào phía bên trái và sau đó kêu gọi điều hành bổ sung vào nó:

scala> 2. 
res0: Double = 2.0 
+0

Đó là lạ, vui vì họ depracate nó. – Lukasz

20

Trong Scala 2,9 và trước đó, 2. được hiểu như là 2.0 do đó, dấu chấm mơ hồ biểu thị một chữ nổi. Bạn sẽ gọi phương thức một cách rõ ràng bằng cách sử dụng cú pháp (2).+(2).

Cú pháp dấu chấm động mơ hồ sẽ tuy nhiên được tán thành trong 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, tại sao có ba cảnh báo? –

+0

Không biết. Nhưng tất nhiên nó vẫn là một ảnh chụp nhanh (và một bản chụp tự biên dịch). – Debilski

+0

Tôi đoán đó là vấn đề phát lại. – Debilski

Các vấn đề liên quan