代码之家  ›  专栏  ›  技术社区  ›  dtech Ashtonian

F-绑定多态对象的集合

  •  1
  • dtech Ashtonian  · 技术社区  · 5 年前

    假设我有一个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 回复  |  直到 5 年前
        1
  •  3
  •   Andrey Tyukin    5 年前

    那就是

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

    scala.language.existentials .

        2
  •  2
  •   HTNW    5 年前

    你会使用这种类型

    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 处处

    推荐文章