Какова цель расширения анонимного типа в Scala?

Я пытаюсь получить более полное представление о Scala, и я не могу найти правильную usecase для кода, как показано ниже:

class C extends { def m() { /* ... */ } }

В чем обоснование допуска таких конструкций?

Спасибо!

Ответ 1

Я полагаю, что единственное обоснование здесь - "избегать особых случаев, если это возможно". Вы можете расширить любой класс, анонимный класс - это класс, поэтому вы можете расширить анонимный класс.

Ответ 2

Это не анонимный класс! Это ранний инициализатор, и он работает как часть конструктора, который идет перед его суперклассом. Цитирование отличного ответа от другого вопроса о стеке_поперед:

abstract class X {
    val name: String
    val size = name.size
}

class Y extends {
    val name = "class Y"
} with X

Если код был написан вместо

class Z extends X {
    val name = "class Z"
}

тогда исключение нулевого указателя произойдет, когда Z будет инициализирован, потому что размер инициализируется до имени в обычном порядке инициализации (суперкласс перед классом).

Ответ 3

Он называется Ранние определения, и они имеют дело с проблемой порядка инициализации суперкласса.