覆盖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编译器会从中看出错误
是否有可能使这项工作,或有模式来规避这个问题. 解决方法
你不能缩小方法的签名;它不再是同一种方法了.在您的情况下,您无法覆盖
def exec(e: Environment[T]): Unit 同 override def exec(e: MyEnvironment): Unit 第二种方法比第一种方法更具体.它在概念上与例如相同.用def foo(s:String)覆盖def foo(a:Any). 如果你希望它工作,你需要在两个签名中使用相同的类型(请注意,如果你使用上限,如T<:Environment [_],这意味着接受T的方法实际上接受任何子类环境,所以使用MyEnvironment重写将在这种情况下正常工作). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |