Xét đoạn mã sau:Subimplicits rõ ràng
class A { def print = println("A") }
class B extends A { override def print = println("B") }
def foo(implicit a: A) = a.print
def bar(implicit a: A) = {
implicit val b = new B
foo
}
bar(new A) // B
Tôi tự hỏi tại sao gọi foo
trong bar
không được nâng cao một lỗi ambiguous implicit values
. Tất nhiên
implicit val b: A = new B
sẽ tăng lỗi đó. Tại sao foo
chọn ngụ ý b
và không ngụ ý a
tiềm ẩn? Hoặc thậm chí tổng quát hơn: Các quy tắc sẽ được chọn là gì?
EDIT:
Do tôi comment-trò chuyện với Ivan Tôi muốn làm rõ: Tôi sẽ biết câu trả lời cho câu hỏi của tôi nếu tôi đặt tên cho địa phương tiềm ẩn val cách tương tự như tham số phương pháp ngầm.
def bar(implicit a: A) = {
implicit val a = new B
foo
}
Chỉ phạm vi địa phương ghi đè tham số phương thức vì chúng có cùng tên.
thể trùng lặp của [đâu Scala tìm kiếm implicits?] (Http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits) –
Xem thêm http: // eed3si9n.com/implicit-parameter-precedence-again (được liên kết từ câu hỏi đó). –