使用更具体的返回类型扩展Scala中的组件

时间:2014-10-14 14:27:26

标签: scala

以下内容无法编译:

trait Text {
  trait Token
  def tokens: Seq[Token]
}

trait PosText extends Text {
  trait Token extends super.Token {
    def tok: String
  }
}

def foo(p:PosText) = p.tokens.map(_.tok)

出现此错误

  

值tok不是p.Token

的成员

如果我覆盖令牌方法,它将编译。

有没有办法定义类型以使令牌的返回类型更具体?

2 个答案:

答案 0 :(得分:2)

您可以定义抽象类型成员Token而不是特征,然后具体提供实现中的类型。这是一个有效的例子:

trait Text {
  type Token
  def tokens: Seq[Token]
}

trait PosText extends Text {
  type Token <: PosToken
  trait PosToken {
    def tok: String
  }
}

def foo(p: PosText) = p.tokens.map(_.tok)

答案 1 :(得分:0)

对于这种情况,泛型可能更方便,因为它们可能有差异:

trait Text[+Token] {
  def tokens: Seq[Token]
}

trait PosText[+Token <: PosTextToken] extends Text[Token]

trait PosTextToken {
  def tok: String
}

def foo(p:PosText) = p.tokens.map(_.tok)