Вы не можете сделать это с List
. Все элементы в List(c1, c2, c3, c4)
будут одного типа, т.е. C
, и информация о том, что один из них имеет тип C with T
, будет потеряна.
new C {}
, new C with T {}
- значения времени выполнения c1, c2, c3, c4
, компилятор не имеет доступа к ним во время компиляции List(c1, c2, c3, c4)
.
Вы можете сделать это с помощью HList
. Используя shapeless.<:!<
, shapeless.ops.hlist.LiftAll
и kind-проектор
def noElementIsSubtypeOfT[L <: HList](l: L)(implicit liftAll: LiftAll[* <:!< T, L]) = null
noElementIsSubtypeOfT(c1 :: c2 :: c3 :: HNil) // compiles
// noElementIsSubtypeOfT(c1 :: c2 :: c3 :: c4 :: HNil) // doesn't compile
или
def noElementIsSubtypeOfT[L <: HList : LiftAll[* <:!< T, *]](l: L) = null
Для параметра класса вы можете сделать
case class P[U <: C](c: U)(implicit ev: U <:!< T)
P(c1) // compiles
P(c2) // compiles
P(c3) // compiles
// P(c4) // doesn't compile
или
case class P[U <: C : * <:!< T](c: U)