Scala's TypeTags sind relativ einfach zu vergleichen,und capturen - aber bietet Scala eine Kompositionsfunktion, die auf 2 Tags einwirkt? Zum Beispiel arbeite ich sehr allgemein mit Tags (was bedeutet, dass Typ T weg ist). Kann ich Scala bitten, mir einen TypeTag des am wenigsten gemeinsamen Elternteils zu liefern? Dies würde logisch erscheinen, da der Compiler und verschiedene Editor-IDEs dies tun dies mit Leichtigkeit und zeigen Sie das gemeinsame Elternteil.
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
Antworten:
2 für die Antwort № 1Da ist ein lub
Methode an Universe
, die die kleinste Obergrenze einer Liste von Typen berechnet.
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
Ein ... Erstellen TypeTag
aus dem resultierenden Type
ist ein wenig schwieriger, so scheint es, aber möglich, wie in diese Antwort.