Унаследовать черту дважды

Это не работает:

trait Trait
class Class extends Trait with Trait

Компилятор жалуется:

<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                           ^
<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                                      ^

Это делает:

trait Trait
class Abstraction extends Trait
class Implementation extends Abstraction with Trait

Вопросы:

  • Почему это работает?
  • Как второй фрагмент отличается? (относительно проблемы двойного наследования)
  • Является ли второй фрагмент или шаблон каким-то полезным?

Ответ 1

Второй снипп работает из-за линеаризации признаков. Компилятор будет организовывать черты в линейный список, чтобы Trait отображался только один раз. Я думаю, что линеаризация

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any

Смотрите эту главу из программирования Scala для отличного объяснения.

В первую очередь это делается для обеспечения последовательного подхода к проблеме наследования алмазов и полезно в этом случае.

Так как Trait не может появляться дважды после линеаризации, нет смысла писать Trait with Trait, и имеет смысл быть запрещенным.