Scala相关特征,抽象类型

时间:2011-09-17 04:53:42

标签: scala traits subtype abstract-type

我有两个相关的特征。 Dao将被用作一个类,DaoHelper将被Dao的伴侣使用。我想特质Dao能够使用DaoHelper中定义的函数,我唯一可以弄清楚如何做到这一点的方法是将伴随特征定义为val。然而不知何故,伴侣期望它的类型为D.this.T,我认为我已将其定义为Doa的子类型。我在这里很困惑。我为新问题道歉,我来自动态语言背景。

/test2.scala:14:覆盖类型为Test.DaoHelper [D.this.T]的Trait Dao中的值伴侣; [error] value companion具有不兼容的类型 [错误] val companion = 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]
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我不太明白您尝试使用class D做什么,但是您收到此错误是因为您要在D中将companion分配给class D,但是companion的{​​{1}}中定义的类型为DaoHelper[T]。由于Dao的类型为DDao不是Dao的子类型,因此无效。