Scala: указание открытого метода, переопределяющего защищенный метод - PullRequest
7 голосов
/ 23 декабря 2011

Я пишу trait, в котором должен быть указан метод clone, возвращающий CloneResult, вот так:

trait TraitWithClone extends Cloneable {
  def clone: CloneResult
}

Намерение здесь состоит в том, чтобы ужесточить тип возвращаемого значения java.lang.Object s clone() к чему-то полезному для этого интерфейса.Однако, когда я пытаюсь это скомпилировать, я получаю:

error: переопределение метода clone в признаке View2 типа () CloneResult;метод clone в классе Object типа () java.lang.Object имеет более слабые права доступа;оно должно быть публичным;(Обратите внимание, что метод clone в признаке View2 типа () CloneResult является абстрактным и, следовательно, переопределяется конкретным методом clone в классе Object типа () java.lang.Object)

Как я могу требоватьчто реализация будет public, когда у Scala нет ключевого слова?Я знаю, что могу сделать:

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

... но это похоже на взлом.Есть предложения?

1 Ответ

4 голосов
/ 23 декабря 2011

Вот важная часть сообщения об ошибке: «и, следовательно, переопределяется конкретным методом-клоном в классе 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...