重写Scala中通用特征的方法

我定义了一个通用的环境特征:

trait Environment[T]

为此我提供了这个实现:

class MyEnvironment extends Environment[Integer] {
 val specific: Integer = 0
}

此外,我定义了一个通用事件特征,它具有一个接受通用环境作为参数的方法:

trait Event[T] {
  def exec(e: Environment[T])
}

对于此事件特征,我提供了以下实现,其中exec()方法接受MyEnvironment类型的参数,以使我能够访问MyEnvironment的特定值。

class MyEvent extends Event[Integer] {
  override def exec(e: MyEnvironment): Unit = {
    println(e.specific)
  }
}

但是,Scala编译器会输出一个错误,看起来MyEnvironment不会被识别为Environment [Integer]:

错误:方法exec覆盖任何内容。

注意:MyEvent类的超类包含以下非最终成员exec:def exec(t:main.vub.lidibm.test.Environment [Integer]):Unit

是否有可能做到这一点,或者是否有模式来规避这个问题。


你不能缩小方法的签名; 它不再是同样的方法。 在你的情况下,你不能重写

def exec(e: Environment[T]): Unit

override def exec(e: MyEnvironment): Unit 

第二种方法比第一种更具体。 它在概念上与def foo(s: String)重写def foo(a: Any)相同。

如果你希望它能够工作,你需要在两个签名中使用相同的类型(注意如果你使用上限如T <: Environment[_] ,这意味着接受T的方法实际上接受任何Environment子类,因此在这种情况下使用MyEnvironment重写将可以正常工作)。


因为重写在方法的参数类型中不是多态的。 它的工作方式与Java相同。 在这个例子中,你所做的是将现实中的方法超载。也就是说,它们被视为不同的方法。
重写方法名称即。 名称,签名,类型必须相同。

链接地址: http://www.djcxy.com/p/51027.html

上一篇: Overriding the method of a generic trait in Scala

下一篇: type of a child trait in a parent trait in scala