隐含和声明的顺序

elb*_*ich 6 scala implicit

这是我遇到的简化.这编译:

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)

隐式可见性的规则是不同的,无论其类型是否明确声明.如果不是,则隐含只在声明点之后可用(作为隐式).

原因是如果未声明类型(如递归例程),类型推断可能会变得太难.在许多情况下,推理很容易(如在您的代码中),但规范必须明确.