Какова цель расширения анонимного типа в Scala? - PullRequest
11 голосов
/ 28 сентября 2011

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

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

Каково обоснование для разрешения таких конструкций?

Спасибо!

Ответы [ 3 ]

12 голосов
/ 28 сентября 2011

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

11 голосов
/ 09 октября 2012

На самом деле это не анонимный класс! Это ранний инициализатор, который запускается как часть конструктора, предшествующего его суперклассу. Цитируя отличный ответ от другого вопроса stackoverflow :

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, потому что размер инициализируется перед именем в обычном порядке инициализации (суперкласс перед классом).

1 голос
/ 26 апреля 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...