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

Scala:指定覆盖受保护方法的公共方法

发布时间:2020-12-16 19:16:22 所属栏目:安全 来源:网络整理
导读:我正在编写一个特性,应该指定返回CloneResult的方法clone,如下所示: trait TraitWithClone extends Cloneable { def clone: CloneResult} 这里的目的是将java.lang.Object的clone()的返回类型收紧到对此接口有用的东西.但是,当我尝试编译它时,我得到: erro
我正在编写一个特性,应该指定返回CloneResult的方法clone,如下所示:

trait TraitWithClone extends Cloneable {
  def clone: CloneResult
}

这里的目的是将java.lang.Object的clone()的返回类型收紧到对此接口有用的东西.但是,当我尝试编译它时,我得到:

error: overriding method clone in trait View2 of type ()CloneResult;
method clone in class Object of type ()java.lang.Object has weaker access privileges; it should be public;
(Note that method clone in trait View2 of type ()CloneResult is abstract,
and is therefore overridden by concrete method clone in class Object of type ()java.lang.Object)

当Scala没有关键字时,我如何要求实现公开?我知道我能做到:

trait TraitWithClone extends Cloneable {
  override def clone = cloneImpl
  protected def cloneImpl: CloneResult
}

……但这似乎是一个黑客.有什么建议?

解决方法

这是错误消息的重要部分:“因此被类Object中的具体方法克隆覆盖”.

您应该在特征中提供克隆方法的实现.它不是理想的,但它是你必须要做的,因为clone是Object上的具体方法.

trait TraitWithClone extends Cloneable {
  override def clone: CloneResult = throw new CloneNotSupportedException
}

虽然,通常你直接在你的具体类中做这种事情:

class Foo extends Cloneable {
  override def clone: Foo = super.clone.asInstanceOf[Foo]
}

scala> new Foo
res0: Foo = Foo@28cc5c6c

scala> res2.clone
res1: Foo = Foo@7ca9bd

(编辑:李大同)

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

    推荐文章
      热点阅读