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