我正在写一个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
......但这似乎是一个黑客。有什么建议吗?
答案 0 :(得分:4)
这是错误消息的重要部分:“因此被类Object中的具体方法克隆所覆盖。”
您应该在特征中提供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