这是我遇到的简化.这编译:
trait A { implicit val x = 1 }
trait B extends A { val y = implicitly[Int] }
Run Code Online (Sandbox Code Playgroud)
虽然这不(找不到隐含值):
trait B extends A { val y = implicitly[Int] }
trait A { implicit val x = 1 }
Run Code Online (Sandbox Code Playgroud)
我试图通过指定一个自我类型来明确我的意图:trait A { this: B => ... }
但无济于事.
如何处理这种依赖关系而不必担心我的代码是如何布局的?
Did*_*ont 11
您需要明确声明类型,至少对于后者
trait B extends A { val y = implicitly[Int] }
trait A { implicit val x : Int = 1 }
Run Code Online (Sandbox Code Playgroud)
隐式可见性的规则是不同的,无论其类型是否明确声明.如果不是,则隐含只在声明点之后可用(作为隐式).
原因是如果未声明类型(如递归例程),类型推断可能会变得太难.在许多情况下,推理很容易(如在您的代码中),但规范必须明确.