2012-01-30 54 views
17

tôi viết những chuyển đổi ngầm sau trong scala:Tại sao loại chuyển đổi ngầm này là bất hợp pháp?

implicit def strToInt2(str: String):Int = { 
    str.toInt 
    } 

Nhưng nó tăng lên lỗi này biên soạn:

<console>:9: error: type mismatch; 
found : str.type (with underlying type String) 
required: ?{val toInt: ?} 
Note that implicit conversions are not applicable because they are ambiguous: 
both method augmentString in object Predef of type (x: String)scala.collection. 
immutable.StringOps 
and method toi in object $iw of type (str: String)Int 
are possible conversion functions from str.type to ?{val toInt: ?} 
      str.toInt 
     ^

Nếu tôi loại bỏ các kiểu trả về, chỉ cần khai báo nó như thế này:

implicit def strToInt2(str: String) = { 
    str.toInt 
    } 

Nó biên dịch thành công. Bất cứ ai có thể cho tôi biết sự khác biệt giữa hai là gì?

+0

Không biết câu trả lời chính xác, nhưng tôi cho rằng có một chuỗi chuyển đổi tiềm ẩn -> int trong Predef. Vì vậy, việc thêm chuyển đổi mới của các loại đó làm cho mọi thứ trở nên mơ hồ. – dmitry

Trả lời

17

Ok, chúng ta hãy bắt đầu với đầu, tại sao nó thất bại trong trường hợp đầu tiên:

  1. Bạn cố gắng xác định một phương pháp ngầm rằng biến đổi một String thành một Int và làm như vậy bạn gọi toInt.
  2. Thật không may, toInt không phải là một phần của lớp học String. Vì vậy, trình biên dịch cần phải tìm một ẩn để chuyển đổi str trong một cái gì đó có một phương pháp toInt:Int.
  3. May mắn thay, Predef.augmentString chuyển đổi một String thành một StringOps, có phương thức như vậy.
  4. Nhưng loại Int cũng có phương thức như vậy và AS bạn xác định kiểu trả về, phương thức strToInt2 có thể được gọi đệ quy, và vì phương pháp ngầm ẩn, nó có thể được áp dụng để biến đổi điều gì đó với hàm toInt:Int.
  5. Trình biên dịch không biết phương pháp ngầm để sử dụng (giữa bạn và Predef.augmentString và ném một lỗi.

Trong trường hợp thứ hai, khi bạn bỏ qua các kiểu trả về, các strToInt2 chức năng không thể đệ quy, và có không còn là hai ứng cử viên để chuyển đổi String

NHƯNG nếu sau khi định nghĩa này, bạn thử:. "2".toInt, lỗi này là trở lại:. bây giờ bạn có hai cách để có được một cái gì đó với một chức năng toInt:Int khi bạn có một String

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