Scala:指定公共方法覆盖受保护的方法
Posted
技术标签:
【中文标题】Scala:指定公共方法覆盖受保护的方法【英文标题】:Scala: Specifying public method overriding protected method 【发布时间】:2012-01-26 23:36:27 【问题描述】:我正在写一个trait
,它应该指定方法clone
返回一个CloneResult
,如下所示:
trait TraitWithClone extends Cloneable
def clone: CloneResult
这里的目的是将java.lang.Object
的clone()
的返回类型收紧到对该接口有用的东西。但是,当我尝试编译它时,我得到:
错误:在 ()CloneResult 类型的特征 View2 中覆盖方法克隆; ()java.lang.Object 类型的类 Object 中的方法 clone 具有较弱的访问权限;它应该是公开的; (请注意, ()CloneResult 类型的特征 View2 中的方法 clone 是抽象的, 因此被 ()java.lang.Object) 类 Object 中的具体方法 clone 覆盖
当 Scala 没有关键字时,我如何要求实现为 public
?我知道我能做到:
trait TraitWithClone extends Cloneable
override def clone = cloneImpl
protected def cloneImpl: CloneResult
...但这似乎是一个黑客行为。有什么建议吗?
【问题讨论】:
override def clone(): CloneResult
工作吗?
否;这是我尝试的第一件事。
回去试了一下,没有豆子。
【参考方案1】:
这是错误消息的重要部分:“因此被 Object 类中的具体方法克隆覆盖”。
您应该在您的 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
【讨论】:
以上是关于Scala:指定公共方法覆盖受保护的方法的主要内容,如果未能解决你的问题,请参考以下文章