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

Ken*_*len 7 methods overriding clone scala protected

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

trait TraitWithClone extends Cloneable {
  def clone: CloneResult
}
Run Code Online (Sandbox Code Playgroud)

这里的目的是收紧对这个界面有用java.lang.Objectclone()东西的返回类型.但是,当我尝试编译它时,我得到:

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

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

trait TraitWithClone extends Cloneable {
  override def clone = cloneImpl
  protected def cloneImpl: CloneResult
}
Run Code Online (Sandbox Code Playgroud)

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

lee*_*777 4

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

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

trait TraitWithClone extends Cloneable {
  override def clone: CloneResult = throw new CloneNotSupportedException
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)