Заменить окончательный метод

Окончательные методы не могут быть переопределены в подклассе. Но с магией Scala кажется, что это возможно.

Рассмотрим следующий пример:

trait Test {
  final def doIt(s: String): String = s
}

object TestObject extends Test {
  def doIt: String => String = s => s.reverse
}

Метод doIt в объекте TestObject имеет не та же подпись, что и doIt в признаке Test. Таким образом, doIt перегружается, а не переопределяется. Но обычный вызов doIt всегда вызывает метод в TestObject:

val x = TestObject.doIt("Hello")                //> x  : String = olleH

Вопрос: Как вызвать исходный метод doIt на TestObject. Возможно ли это или этот метод "вроде переопределен"?

Ответы

Ответ 1

Вы можете использовать TestObject как Test следующим образом:

(TestObject: Test).doIt

Ответ 2

Еще один способ хакиши - вызвать doIt с именованным параметром, например:

val x = TestObject.doIt(s = "Hello") 

Ответ 3

Попробуйте следующее:

TestObject.asInstanceOf[Test].doIt("Hello")