以最小输出获得`lub`?

时间:2017-03-16 14:26:17

标签: scala

How to define a function which accept both Seq[T] and ParSeq[T] as parameter?,我认为lub(最低上限)是合适的

然而,它给出了以下,长输出:

import scala.reflect.runtime.universe._
scala> lub( List( typeOf[scala.collection.Seq[Int]],
                  typeOf[scala.collection.parallel.ParSeq[Int]] ) )
res1: reflect.runtime.universe.Type = scala.collection.GenSeq[Int]{def ...

看起来GenSeqlub。但是,如何才能单独获取该类型,即GenSeq[Int],排除其他详细信息?

1 个答案:

答案 0 :(得分:1)

通过调用Type获得的lub是实际的LUB(最小上限),要求“单独类型”具有误导性,一个已经是正确的LUB。

GenSeq[Int]是上限但不是LUB,它是LUB的超类。

那个神秘的类型实际上是RefinedType,所以你可以获得它的超类列表:

import reflect.runtime.universe._

def unRefined(tp: Type): List[Type] = tp match {
  case rtp: RefinedType => rtp.parents
  case _ => ???
}

回到你的例子,它给你:

scala> unRefined(res1)
res2: List[reflect.runtime.universe.Type] = List(scala.collection.GenSeq[Int])