Тип собственного FooBad
расширен компилятором до FooBad with A
(так что вы все равно можете получить доступ к элементам, которые вы определяете сами). Это означает, что T
получает определение в A
, а не определение в FooBad
, как вы ожидаете. Вы можете исправить свой код, изменив определение FooBad
, чтобы явно добавить свой собственный тип:
trait FooBad { this: A with FooBad =>
..
}
или даже лучше, используя подклассы
trait FooBad extends A {
..
}
Я считаю, что в большинстве случаев самотипы должны быть заменены простым подклассом. Это проще для понимания, менее страшно и приводит к лучшей инкапсуляции.