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

pau*_*ies 0 inheritance scala traits

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

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

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

    def passed() : Boolean = ...

    def update[T]( data : T ) : Unit
}
Run Code Online (Sandbox Code Playgroud)

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

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

trait CheckBar extends Check[Bar]{ val baz = 2 }
Run Code Online (Sandbox Code Playgroud)

这是为了避免我在每个Foo和Bar检查中定义baz.

然后我有一些实际的Foo检查,例如

class CheckFooOne extends CheckFoo
{
    def update( data : Foo ) : Unit = ...
}
Run Code Online (Sandbox Code Playgroud)

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

我做错了什么?我确信我错过了一些微妙之处.我很抱歉,如果还有这样的问题,但是我想不出要搜索的内容,而且我已经毫无欢乐地查看了类似问题的列表.

gou*_*ama 5

您的update方法的参数化类型T恰好与您的类的类型参数具有相同的名称.

你的特质Check等同于:

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

    def passed() : Boolean = ...

    def update[U]( data : U ) : Unit
}
Run Code Online (Sandbox Code Playgroud)

你可能想要这个:

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

    def passed() : Boolean = ...

    def update( data : T ) : Unit
}
Run Code Online (Sandbox Code Playgroud)