Ответ 1
Второй снипп работает из-за линеаризации признаков. Компилятор будет организовывать черты в линейный список, чтобы Trait
отображался только один раз. Я думаю, что линеаризация
Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any
Смотрите эту главу из программирования Scala для отличного объяснения.
В первую очередь это делается для обеспечения последовательного подхода к проблеме наследования алмазов и полезно в этом случае.
Так как Trait
не может появляться дважды после линеаризации, нет смысла писать Trait with Trait
, и имеет смысл быть запрещенным.