Scala 含义与申报顺序

Scala 含义与申报顺序,scala,implicit,Scala,Implicit,下面是我遇到的情况的简化。这包括: trait A { implicit val x = 1 } trait B extends A { val y = implicitly[Int] } 虽然此项没有(找不到隐式值): 我试图通过指定一个自我类型来明确我的意图:trait a{this:B=>…},但没有成功 如何处理这种依赖关系而不必担心代码的布局?您需要显式声明类型,至少对于后一种类型 trait B extends A { val y = implicitly[Int] } trait

下面是我遇到的情况的简化。这包括:

trait A { implicit val x = 1 }
trait B extends A { val y = implicitly[Int] }
虽然此项没有(找不到隐式值):

我试图通过指定一个自我类型来明确我的意图:
trait a{this:B=>…}
,但没有成功


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

您需要显式声明类型,至少对于后一种类型

trait B extends A { val y = implicitly[Int] }
trait A { implicit val x : Int = 1 }
隐式可见性的规则是不同的,无论其类型是否显式声明。如果不是,则隐式仅在声明点之后可用(作为隐式)


原因是,如果没有声明类型(如在递归例程中),则类型推断可能会变得太困难。在许多情况下,推断很容易(就像在代码中一样),但规范必须明确

隐式对象呢?你能给我指出规范中关于隐式问题解决的部分吗<编码>性状X;特征B扩展了A{valy=隐式[X]};特征A{implicit object x extends x}很抱歉回答晚了。在对规范进行了粗略的查看之后,我找不到规则。但是在中提到了它,看起来它是实现所做的,但是它还没有达到规范。我不明白为什么它不应该与隐式对象一起工作。
trait B extends A { val y = implicitly[Int] }
trait A { implicit val x : Int = 1 }