Scala中两个标签中最不常见的TypeTag?

时间:2015-03-11 01:11:36

标签: scala scala-macros

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

1 个答案:

答案 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中所示。