【问题标题】:Implicits and order of declaration声明的隐含和顺序
【发布时间】:2012-03-07 11:27:24
【问题描述】:

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

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 => ... },但无济于事。

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

【问题讨论】:

    标签: scala implicit


    【解决方案1】:

    您需要显式声明类型,至少对于后者而言

    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 }
    • 很抱歉回答迟了。在规范中粗略地查看之后,我找不到规则。但是在this bug report 中提到了它,看起来这就是实现的作用,但它还没有达到规范。我不明白为什么它不应该与隐式对象一起使用。
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多