加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

覆盖Scala中通用特征的方法

发布时间:2020-12-16 10:00:40 所属栏目:安全 来源:网络整理
导读:我定义了一个通用的环境特征: trait Environment[T] 为此我提供了这个实现: class MyEnvironment extends Environment[Integer] { val specific: Integer = 0} 此外,我定义了一个通用事件特征,它有一个接受通用环境作为参数的方法: trait Event[T] { def
我定义了一个通用的环境特征:

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未被识别为环境[整数]:

Error: method exec overrides nothing.

Note: the super classes of class MyEvent contain the following,non final members named 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的方法实际上接受任何子类环境,所以使用MyEnvironment重写将在这种情况下正常工作).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读