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
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 –
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. –