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