代码之家  ›  专栏  ›  技术社区  ›  LaloInDublin

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

  •  2
  • LaloInDublin  · 技术社区  · 9 年前

    Scala的TypeTags比较容易比较和捕获,但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 回复  |  直到 9 年前
        1
  •  2
  •   Community dbr    7 年前

    有一个 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 .