Scala的TypeTag相对容易比较和捕获 - 但Scala是否提供了作用于2个标签的任何合成功能?例如,我以非常普遍的方式使用标签(意思是,类型T已经消失)。我可以请求Scala为我提供最不常见父母的TypeTag吗?这似乎是合乎逻辑的,因为编译器和各种编辑器IDE可以轻松地完成此操作并显示共同的父级。例如:
Class A
Class B extends A
class C extends A
val tagB:TypeTag[_] = implicitly[TypeTag[B]]
val tagC:TypeTag[_] = implicitly[TypeTag[C]]
val res:TypeTag[_] = lcmFunction(tagB,tagC) //not a real function name .. example only
res // yields a TypeTag such that res.tpe =:= TypeTag[A].tpe
答案 0 :(得分:2)
lub
上有一个Universe
方法,它将计算类型列表的最小上限。
class A
class B extends A
class C extends A
class D extends C
class E extends C
class F extends E
import scala.reflect.runtime.universe._
val a = typeTag[A]
val b = typeTag[B]
val c = typeTag[C]
val d = typeTag[D]
val e = typeTag[E]
val f = typeTag[F]
scala> lub(List(b.tpe, c.tpe))
res17: reflect.runtime.universe.Type = A
scala> lub(List(b.tpe, c.tpe)) =:= a.tpe
res18: Boolean = true
scala> lub(List(e.tpe, f.tpe))
res19: reflect.runtime.universe.Type = E
scala> lub(List(c.tpe, d.tpe, f.tpe))
res21: reflect.runtime.universe.Type = C
从结果TypeTag
中创建Type
似乎有点棘手,但可能如this answer中所示。