Значение, которое расширяет аргумент типа

Я пробовал:

sealed trait AorB
trait A extends AorB { def apiA:... }
trait B extends AorB { def apiB:... }

и в другом файле:

trait C[AB<:AorB] extends AB

Но получим error: class type required but AB found

На самом деле я хочу сказать, что подклассы C должны реализовывать либо A, либо B (а не AorB), который используется как некоторый признак - Enum, то есть A или B).

Могу ли я это сделать и как?

Ответы

Ответ 1

Я нашел ответ в одном из "связанных вопросов", предложенных SO (который имел несвязанный заголовок: -):

sealed trait AorB
trait A extends AorB { def apiA:... }
trait B extends AorB { def apiB:... }

trait C { this: AorB => }

Изменить

Я использую это, чтобы иметь некоторый король декартова произведения типов:

sealed trait CorD { this: AorB => }
trait C extends CorD { this: AorB => def apiC:... }
trait D extends CorD { this: AorB => def apiD:... }
// the "this: AorB =>" need to be repeated

Итак (в других файлах снова), мы можем определить:

case class AwithC extends A with C { 
  def apiA:....
  def apiC:....
}

И так далее с любой комбинацией AorB x CorD