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