以下内容无法编译:
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
的成员
如果我覆盖令牌方法,它将编译。
有没有办法定义类型以使令牌的返回类型更具体?
答案 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)