如何正确覆盖(实现)参数化超级特征中定义的方法?

时间:2013-06-03 16:02:33

标签: scala inheritance traits

在Scala中,我试图生成一组通用的检查来运行某些数据。

我的基本特征看起来像这样:

trait Check[T]
{
    def complete() : Boolean = ...

    def passed() : Boolean = ...

    def update[T]( data : T ) : Unit
}

然后我有两个看起来有点像这样的子特征:

trait CheckFoo extends Check[Foo]{ val baz = 1 }

trait CheckBar extends Check[Bar]{ val baz = 2 }

旨在避免我在每个Foo和Bar检查中定义baz。

然后我得到了一些实际的Foo检查,例如

class CheckFooOne extends CheckFoo
{
    def update( data : Foo ) : Unit = ...
}

但是这并没有编译:它告诉我CheckFooOne必须是抽象的,因为没有定义方法更新。

我做错了什么?我确定有一些我错过的微妙之处。我很抱歉,如果还有其他类似的问题,但我无法想到要搜索的内容,而且我已经毫无欢乐地查看了类似问题的列表。

1 个答案:

答案 0 :(得分:5)

您的update方法使用类型T进行参数化,该类型恰好与您班级的类型参数同名。

你的特质Check等同于:

trait Check[T]
{
    def complete() : Boolean = ...

    def passed() : Boolean = ...

    def update[U]( data : U ) : Unit
}

你可能想要这个:

trait Check[T]
{
    def complete() : Boolean = ...

    def passed() : Boolean = ...

    def update( data : T ) : Unit
}