Scala:指定公共方法重写受保护方法

Scala:指定公共方法重写受保护方法,scala,methods,overriding,clone,protected,Scala,Methods,Overriding,Clone,Protected,我正在编写一个trait,它应该指定返回CloneResult的方法clone,如下所示: trait TraitWithClone extends Cloneable { def clone: CloneResult } 这里的意图是将java.lang.Object的clone()的返回类型收紧为对该接口有用的类型。但是,当我尝试编译此文件时,我得到: 错误:重写类型为()CloneResult的trait View2中的方法clone; ()java.lang.Object类型的类对

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

trait TraitWithClone extends Cloneable {
  def clone: CloneResult
}
这里的意图是将
java.lang.Object
clone()
的返回类型收紧为对该接口有用的类型。但是,当我尝试编译此文件时,我得到:

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

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

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

…但这看起来像是一个黑客。有什么建议吗?

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

您应该在trait中提供
clone
方法的实现。这并不理想,但这是您必须做的,因为
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

覆盖def clone():CloneResult
工作吗?否;这是我尝试的第一件事。回去试了试,但没有豆子。