2013-12-08 3 views
16

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

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

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. Возможно ли это или этот метод «вроде переопределен»?

+0

Почему Scala относится к ней как к другой подписи? Это потому, что первый метод, а второй - функция? – SzymonPajzert

ответ

15

Вы можете использовать TestObject в Test, как это:

(TestObject: Test).doIt 
+0

+1. Лучше использовать титрование, чем приведение. –

1

Попробуйте это:

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

Вам не кажется, что 'asInstanceOf' здесь переполнен? – senia

6

Еще немного hackisch способ вызвать Doit с именем параметра, как это:

val x = TestObject.doIt(s = "Hello") 
Смежные вопросы