Scala对象扩展了抽象类/ trait,访问了伴随类字段

时间:2017-09-21 22:37:43

标签: scala abstract-class traits

目前我有以下代码:

case class Foo(text: String, tag: Tag) {...}
object Foo {
    def doSomething(fooSeq: Seq[Foo]) = fooSeq.map(f => f.tag)
    def doSomethingElse() = {...}
}

我想将doSomething方法移动到抽象类/特征中,以便我可以参数化标记并稍后重用代码。理想情况下,我想做这样的事情:

case class Foo(text: String, tag: Tag) {...}
object Foo extends TraitFoo[Tag] {
    def doSomethingElse() = {...}
}

---------------in another file----------------

trait TraitFoo[T] = {
    def doSomething(fooSeq: Seq[TraitFoo[T]]) = fooSeq.map(f => f.tag)
}

但是,编译器抱怨它无法识别f.tag内的TraitFoo

我考虑使用抽象类,但这也会导致问题,因为我的对象Foo不需要构造函数。它只需要访问其伴随类中的字段。

1 个答案:

答案 0 :(得分:0)

也许您可以使用结构绑定向match-row添加另一个类型参数?像这样:

TraitFoo

这与此基本相同,但不那么冗长/不那么明确:

trait TraitFoo[A, B <: { def tag: A }] {
    def doSomething(fooSeq: Seq[B]): Seq[A] = fooSeq.map(f => f.tag)
}

case class Foo(text: String, tag: Tag) { ... }
object Foo extends TraitFoo[Tag, Foo] {
    def doSomethingElse() = { ... }
}