Tough. Попробуйте это:
scala> trait Law[T]
defined trait Law
scala> trait Lawful extends Law[Lawful]
defined trait Lawful
scala> trait Chaotic extends Law[Chaotic]
defined trait Chaotic
scala> class Peter extends Lawful with Chaotic
<console>:8: error: illegal inheritance;
class Peter inherits different type instances of trait Law:
Law[Chaotic] and Law[Lawful]
class Peter extends Lawful with Chaotic
^
Если вы хотите, чтобы требовалось, чтобы тип Law был расширен, то вам нужно использовать собственные типы в некотором базовом классе или признаке:
scala> class Human {
| self: Law[_] =>
| }
defined class Human
scala> class Peter extends Human
<console>:7: error: illegal inheritance;
self-type Peter does not conform to Human's selftype Human with Law[_]
class Peter extends Human
^
И есть еще несколько настроек, обеспечивающих дополнительную безопасность типов. Конечный результат может выглядеть так:
sealed trait Law[T <: Law[T]]
trait Lawful extends Law[Lawful]
trait LNeutral extends Law[LNeutral]
trait Chaotic extends Law[Chaotic]
sealed trait Moral[T <: Moral[T]]
trait Good extends Moral[Good]
trait Neutral extends Moral[Neutral]
trait Evil extends Moral[Evil]
class Human {
self: Law[_] with Moral[_] =>
}