重写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相同。 在这个例子中,你所做的是将现实中的方法超载。也就是说,它们被视为不同的方法。
重写方法名称即。 名称,签名,类型必须相同。