gpt4 book ai didi

scala - Scala中的隐式抽象类构造函数参数和继承

转载 作者:行者123 更新时间:2023-12-04 12:30:06 25 4
gpt4 key购买 nike

我对 Scala 还很陌生,一直在尝试学习和理解隐式转换和参数,但遇到了一个让我感到困惑的场景。

对于上下文,我正在使用 Scaldi 在 Akka 应用程序中进行依赖注入(inject),并希望从抽象类继承多个可注入(inject)的 Actor。我相信我无法准确地将抽象类作为特征,因为我们需要隐含 Injector可通过构造函数参数来利用框架。

展示我所看到的行为的一个非常人为的示例如下:

class SecretSauce {}

abstract class Base(implicit secretSauce: SecretSauce) {}

class Concrete extends Base {}

object Example extends App {
... // Setup Actor system, etc, etc
implicit val secretSauce: SecretSauce = new SecretSauce()
}

我原以为一切正常,但我得到了一个编译错误:
Unspecified value parameter secretSauce.
class Concrete extends Base {
^

如果我将隐式参数添加到具体类中,就像这样,事情会起作用:

class Concrete(implicit secretSauce: SecretSauce) extends Base {}

我认为我的困惑源于隐式参数的工作方式——在我所描述的情况下,它们不是由子类继承的吗?有人可以 ELI5 在我的示例中发生什么或指出可以帮助解决问题的引用吗?

谢谢!

最佳答案

确定 Scala 编译器在何处查找隐式的确切规则有点复杂,但在大多数情况下,您只需要考虑隐式值可能来自两个地方:

  • 当前范围。
  • 所涉及的任何类型的伴随对象。

  • 这意味着这将编译:
    class SecretSauce {}

    object SecretSauce {
    implicit val secretSauce: SecretSauce = new SecretSauce()
    }

    abstract class Base(implicit secretSauce: SecretSauce) {}

    object Example extends App {
    class Concrete extends Base {}
    }

    或这个:
    class SecretSauce {}

    abstract class Base(implicit secretSauce: SecretSauce) {}

    object Example extends App {
    implicit val secretSauce: SecretSauce = new SecretSauce()

    class Concrete extends Base {}
    }

    但是,在您的版本中,当编译器到达这一行时:
    class Concrete extends Base {}

    它会知道它需要找到一个隐含的 SecretSauce值,它将首先查看该行范围内的隐式值,然后查看 SecretSauce伴随对象(如果存在)。它也没有找到,所以它拒绝编译你的代码。

    关于scala - Scala中的隐式抽象类构造函数参数和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34143679/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com