隐含和声明的顺序

时间:2012-03-07 11:27:25

标签: scala implicit

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

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 => ... }来明确我的意图,但无济于事。

如何处理这种依赖关系而不必担心我的代码是如何布局的?

1 个答案:

答案 0 :(得分:11)

您需要明确声明类型,至少对于后者

trait B extends A { val y = implicitly[Int] }
trait A { implicit val x : Int = 1 }

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

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