Вы бы использовали этот тип
T forSome { type T <: FBound[T] }
// equivalent
FBound[T] forSome { type T <: FBound[T] }
Для представления "некоторого FBound
объекта".В вашем случае
val canBeEither: Option[T forSome { type T <: FBound[T] }] = Some(B())
canBeEither.collect { case b: B => b }.foreach(println)
Вы, вероятно, всегда должны избегать вытягивания компоновщика из приложения конструктора типов.Например, для List
:
val eithers: List[T forSome { type T <: FBound[T] }]
= List[T forSome { type <: FBound[T] }](A(), B()) // ok
val eithers: List[T] forSome { type T <: FBound[T] }
= List[ThereIsNothingThatCanGoHere](A(), B()) // not ok
Так что вы можете сказать:
type SomeFBound = T forSome { type T <: FBound[T] }
И использовать SomeFBound
везде.