2015-10-16 17 views
7

Ví dụ đầu tiên tìm thấy thành công trong việc chuyển đổi ngầm với phương pháp foo(String), tuy nhiên ngay sau khi tôi thêm một tham số kiểu (xem fails) các biên dịch không giải quyết được nó nữa:Tại sao độ phân giải ngầm Scala không thành công cho phương thức quá tải với tham số kiểu?

object works { 
    class A { 
    def foo(): String = ??? 
    } 
    implicit class PimpedA(a: A) { 
    def foo(i: String): String = ??? 
    } 
    val a = new A() 
    a.foo("test") //compiles 
} 

object fails { //same as `works`, but adds type parameter 
    class A { 
    def foo[T](): String = ??? 
    } 
    implicit class PimpedA(a: A) { 
    def foo[T](i: String): String = ??? 
    } 
    val a = new A() 
    PimpedA(a).foo("test") // compiles 
    a.foo("test") // error: too many arguments for method foo:()String 
} 

Hành vi này là như nhau cho Scala 2.11.7 và 2.12.0-M3.

Tài liệu về implicits dường như không bao gồm điều này và tôi không tìm thấy trường hợp chính xác này trên stackoverflow.

Lưu ý rằng mục tiêu của tôi là quá tải phương thức foo - nếu tôi đổi tên, trình biên dịch sẽ tìm thấy nó.

http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html

+0

Tại sao bạn sử dụng cùng một tên 'foo' cho hình ảnh được đặt trong pimp? Có lẽ nó là hiển nhiên, nhưng nếu bạn gọi nó là 'bar' lỗi không biểu hiện –

+0

Tôi biết, nhưng tôi muốn quá tải' foo' - Tôi vừa cập nhật câu hỏi. –

Trả lời

1

Cả hai trường hợp dường như thuộc trường hợp này của the specification:

Lần được áp dụng trong ba tình huống:

...

Trong một lựa chọn e.m(args) với e của loại T, nếu bộ chọn m biểu thị một số thành viên của T, nhưng không ai trong số những thành viên này được áp dụng cho các đối số args. Trong trường hợp này, chế độ xem v được tìm kiếm có thể áp dụng cho e và kết quả có chứa phương pháp m áp dụng cho args. Tìm kiếm được tiến hành như trong trường hợp các tham số ngầm định, trong đó phạm vi tiềm ẩn là một trong số T. Nếu tìm thấy một khung nhìn như vậy, lựa chọn e.m sẽ được chuyển thành v(e).m(args).

Vì vậy, nó sẽ hoạt động. Tôi đã thực sự ngạc nhiên khi thấy nó, bởi vì tôi chưa bao giờ chạy vào trường hợp làm việc trước đây và giả định rằng không có tìm kiếm tiềm ẩn nếu T có bất kỳ thành viên nào có tên m. Tôi đã xem nhanh http://issues.scala-lang.org/ nhưng không thể tìm thấy vấn đề có liên quan.

+0

Cảm ơn Alexey. Tôi đã tạo một vấn đề trên scala-lang jira: https://issues.scala-lang.org/browse/SI-9523 –

+0

đầu ra gỡ lỗi typer: https://gist.github.com/echojc/750ba177f88f4e81d2d0 –

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