隐式转换和声明顺序

6
这是我遇到的简化版问题。以下代码可以编译:
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个回答

11

您需要明确声明类型,至少对于后者是这样。

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

如果其类型没有被明确声明,隐式可见性的规则会不同。如果未声明,在声明点之后才能使用(作为隐式)。原因是如果类型未声明(如递归例程),类型推断可能会变得太困难。在许多情况下,推断很容易(如您的代码),但规范必须明确。


隐式对象怎么样?您能指出规范中关于隐式解析的部分吗?trait X; trait B extends A { val y = implicitly[X] }; trait A { implicit object x extends X } - elbowich
1
抱歉回复晚了。在仔细查看规范后,我没有找到这个规则。然而,在此错误报告中提到了它,看起来这就是实现所做的,但它还没有被纳入规范。我不明白为什么它不能与隐式对象一起使用。 - Didier Dupont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接