Ответ 1
Вы можете использовать TestObject
как Test
следующим образом:
(TestObject: Test).doIt
Окончательные методы не могут быть переопределены в подклассе. Но с магией 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
. Возможно ли это или этот метод "вроде переопределен"?
Вы можете использовать TestObject
как Test
следующим образом:
(TestObject: Test).doIt
Еще один способ хакиши - вызвать doIt с именованным параметром, например:
val x = TestObject.doIt(s = "Hello")
Попробуйте следующее:
TestObject.asInstanceOf[Test].doIt("Hello")