覆盖 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 编译器输出一个错误,从那里似乎我的环境不被识别为环境[整数]:

错误:方法可执行文件不覆盖任何内容。

注意:类 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相同。在示例中,您所做的实际上是重载该方法。也就是说,它们被视为不同的方法。
用于覆盖方法名称,即。名称、签名、类型必须相同。

最新更新