2012-01-30 30 views
5

Nếu tôi đánh giá biểu thức sau đây trong Scala REPL:Scala trả về các loại khác nhau cho các biểu thức rất giống

scala> "1" + 1 
res0: java.lang.String = 11 

kiểu trả về là: java.lang.String.

Nếu tôi đánh giá biểu thức này tương tự:

scala> 1 + "1" 
res1: String = 11 

kiểu trả về là: Chuỗi.

Tại sao lại có sự khác biệt?

+2

Câu hỏi tương tự: http://stackoverflow.com/questions/6559938/scala-string-vs-java-lang-string-type-inference –

+3

Cả hai trả về 'Chuỗi' trong Scala 2.10. – soc

Trả lời

14

Không có sự khác biệt, tuy nhiên nó cũng không phải là lỗi. Trong trường hợp này:

"1" + 1 

bạn đang sử dụng tính năng tích hợp của Java để nối bất kỳ thứ gì vào chuỗi. Sau khi tất cả, nhiều người chuyển đổi số thành chuỗi bằng cách sử dụng "thành ngữ" như sau:

String s = "" + 5; 

Nó hoạt động trong Scala như tốt và kết quả với java.lang.String - giống như trong Java.

Mặt khác:

1 + "1" 

là một chút phức tạp hơn. Này được dịch sang:

1.+("1") 

và phương pháp +() được lấy từ Int.+ phương pháp nằm ở Int.scala:

final class Int extends AnyVal { 
    //.... 
    def +(x: String): String = sys.error("stub") 

Các String trong bối cảnh này được định nghĩa trong Predef.scala:

type String  = java.lang.String 

mà là nguồn của loại "khác biệt ". Như bạn có thể thấy cả hai chuỗi trên thực tế là cùng loại.

2

"1"+1 gọi toán tử của java.lang.String +, 1+"1" gọi toán tử + được xác định bởi thời gian chạy scala (không thể tìm thấy ngay bây giờ), vì vậy nó trả về chuỗi scala.

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