为什么我不能嵌入隐式调用

时间:2019-04-25 17:40:28

标签: scala implicit-conversion implicit

说我有以下内容:

class A {
    def foo() = { println("foo") }
}

case class B(a: A)

implicit def toA(b: B) = b.a

implicit def wrapper(a: A) = new {
    def bar() = a.foo()
}

然后我无法执行以下操作:

val b = B(new A())
b.bar() // cannot resolve

相反,我需要显式调用隐式的toA():

toA(b).bar()

或做

(b: A).bar()

为什么编译器在应用第二个隐式包装之前不知道先应用第一个隐式包装?

1 个答案:

答案 0 :(得分:2)

  

一次一次的规则:仅尝试一次隐式。编译器将永远不会将x + y重写为convert1(convert2(x)) + y。这样做会导致错误代码的编译时间大大增加,并且会增加程序员编写的内容与程序实际执行的内容之间的差异。为了理智,当编译器已经在尝试其他隐式转换的过程中时,它不会再插入其他隐式转换。但是,有可能通过使隐式对象采用隐式参数来规避此限制,这将在本章后面进行介绍。

21.2 Rules for implicits节,来自Scala编程,First Edition 由Martin Odersky,Lex Spoon和Bill Venners撰写。