2011-12-23 110 views
7

我正在寫一個trait應指定方法clone返回CloneResult,像這樣:斯卡拉:指定公共方法覆蓋保護的方法

trait TraitWithClone extends Cloneable { 
    def clone: CloneResult 
} 

這裏的目的是收緊的返回類型的java.lang.Object「 s 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)

我怎麼能要求的實現是public,當Scala沒有關鍵字?我知道我可以這樣做:

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

......但這似乎是一個黑客。有什麼建議麼?

+0

是否'超越高清的clone():CloneResult'工作? – 2011-12-23 18:47:05

+0

不;那是我嘗試的第一件事。 – 2011-12-23 23:34:55

+0

用括號? – 2011-12-24 03:04:06

回答

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 = [email protected] 

scala> res2.clone 
res1: Foo = [email protected]