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

时间:2011-12-23 17:29:03

标签: scala methods override clone protected

我正在写一个trait,应该指定方法clone返回CloneResult,如下所示:

trait TraitWithClone extends Cloneable {
  def clone: CloneResult
}

这里的目的是将java.lang.Object的{​​{1}}的返回类型收紧到对此界面有用的东西。但是,当我尝试编译它时,我得到:

  

错误:在特征View2中重写方法克隆类型为()CloneResult;   类型为()java.lang.Object的类Object中的方法clone具有较弱的访问权限;它应该是公开的;   (注意,类型为()CloneResult的特征View2中的方法克隆是抽象的,   并因此被类型为()java.lang.Object的类Object中的具体方法clone覆盖

当Scala没有关键字时,如何要求实施为clone()?我知道我能做到:

public

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

1 个答案:

答案 0 :(得分:4)

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

您应该在特征中提供clone方法的实现。这不是理想的,但这是你必须做的,因为cloneObject的具体方法。

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