F绑定多态对象的集合

时间:2019-01-25 15:27:25

标签: scala f-bounded-polymorphism

说我有一个F界多态性状:

sealed trait FBound[Me <: FBound[Me]]
case class A() extends FBound[A]
case class B() extends FBound[B]

如果我的收藏集可以是任何实例,怎么使用?

val canBeEither: Option[FBound[_]] = Some(B())

// error: type arguments [_$1] do not conform to trait FBound's type parameter bounds [Me <: FBound[Me]]
canBeEither.collect({ case b: B => b}).foreach(b => println("got a B!"))

2 个答案:

答案 0 :(得分:3)

那是

val canBeEither: Option[X forSome { type X <: FBound[X] }] = Some(B())

但是我敦促您在代码中使用它之前再三考虑。它还会为您提供一系列有关存在性类型的警告,您必须通过导入scala.language.existentials使其静音。

答案 1 :(得分:2)

您将使用这种类型

ready()

表示“某些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] }