【问题标题】:Scala: Specifying public method overriding protected methodScala:指定公共方法覆盖受保护的方法
【发布时间】:2012-01-26 23:36:27
【问题描述】:

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

trait TraitWithClone extends Cloneable {
  def clone: CloneResult
}

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

错误:在 ()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 工作吗?
  • 否;这是我尝试的第一件事。
  • 回去试了一下,没有豆子。

标签: scala methods overriding clone protected


【解决方案1】:

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

您应该在您的 trait 中提供 clone 方法的实现。这并不理想,但这是你必须要做的,因为cloneObject 上的具体方法。

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

【讨论】:

    猜你喜欢
    • 2019-02-13
    • 2013-07-01
    • 2016-12-26
    • 2011-08-04
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多