/ / Am häufigsten TypTag von zwei Tags in Scala? - Scala, Scala-Makros

Am wenigsten verbreitet TypeTag von zwei Tags in Scala? - Scala, Scala-Makros

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 № 1

Da 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.