【问题标题】:Scala related trait, abstract typesScala 相关特征,抽象类型
【发布时间】:2011-11-19 03:12:06
【问题描述】:

我有 2 个相关的特征。 Dao 将用作一个类,而 DaoHelper 将由 Dao 的伴生对象使用。我希望 trait Dao 能够使用 DaoHelper 中定义的函数,我能弄清楚如何做到这一点的唯一方法是将伴随 trait 定义为 val。然而不知何故,同伴希望它的类型是 D.this.T,我认为我已将其定义为 Doa 的子类型。我在这里很困惑。对于新手问题,我深表歉意,我来自动态语言背景。

/test2.scala:14: 在 Test.DaoHelper[D.this.T] 类型的 trait Dao 中覆盖值伴侣; [错误] 值伴侣的类型不兼容 [错误] val 伴侣 = D

object Test extends App {

  trait Dao {
    type T <: Dao
    val companion: DaoHelper[T]
    def getHelpfulData = companion.help
  }

  trait DaoHelper[Dao] {
    val help = "Some helpful data"
  }

  class D extends Dao {
    val companion = D
  }

  object D extends DaoHelper[D]
}

【问题讨论】:

    标签: scala traits subtype abstract-type


    【解决方案1】:

    companion 的类型是 DaoHelper[T],但是 T 没有在 D 中的任何地方指定,那么编译器怎么知道它应该是 D 类中的 D?您可以通过在 D 中覆盖它来修复它。

    class D extends Dao {
      type T = D
      val companion = D
    }
    

    【讨论】:

    • 啊,我明白你在说什么。实际上,我想避免在具体类中显式声明类型。胡闹之后,神奇的'_'val companion: DaoHelper[_ &lt;: Dao]。我早该知道。我猜这是说,接受具有 Dao 超类型的 DaoHelper 类型构造函数的任何类型???显然我完全摆脱了 T。
    【解决方案2】:

    我不太明白你想用 class D 做什么,但你收到此错误是因为你在 class D 中将 D 分配给 companion,但 companion 的类型为 @987654326 @ 如Dao 中所定义。由于D 的类型为Dao 并且Dao 不是DaoHelper[T] 的子类型,因此这不起作用。

    【讨论】:

    • D(对象)没有类型Dao,它扩展了DaoHelper[D]
    • 我认为我正在将对象 D 分配给 val 同伴。对象 D 是 DaoHelper[D] 的子类型,D 类是 Dao 的子类型。
    • 也许我可以重新表述我的要求,因为我同意我没有很好地解释它们。我有 2 个特征,1 个用于类,一个用于对象。该对象将是该类的伴随对象。我希望能够不明确地引用类中的伴随对象( Not Classname.function() )。似乎在类扩展的特征中设置一个 val 对应于伴随对象,似乎是最简单的方法。但是我不确定该给出什么类型。
    猜你喜欢
    • 2011-05-14
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多