estoy interesado en crear un TypeTag manualmente (desde 2.10M5):¿Cómo crear un TypeTag manualmente?
object X {
import reflect.runtime.universe._
def tt[A : TypeTag](a: A) = typeTag[A] // how to do this manually?
val t = tt(List("")(_))
}
scalac -Xprint:typer <file>.scala
resultados en
package <empty> {
object X extends scala.AnyRef {
def <init>(): X.type = {
X.super.<init>();
()
};
import scala.reflect.runtime.`package`.universe._;
def tt[A >: Nothing <: Any](a: A)(implicit evidence$1: reflect.runtime.universe.TypeTag[A]): reflect.runtime.universe.TypeTag[A] = scala.reflect.runtime.`package`.universe.typeTag[A](evidence$1);
private[this] val t: reflect.runtime.universe.TypeTag[Int => String] = X.this.tt[Int => String](((x$1: Int) => immutable.this.List.apply[String]("").apply(x$1)))({
val $u: reflect.runtime.universe.type = scala.this.reflect.runtime.`package`.universe;
val $m: $u.Mirror = scala.this.reflect.runtime.`package`.universe.runtimeMirror(this.getClass().getClassLoader());
$u.TypeTag.apply[Int => String]($m, {
final class $typecreator1 extends TypeCreator {
def <init>(): $typecreator1 = {
$typecreator1.super.<init>();
()
};
def apply[U >: Nothing <: scala.reflect.base.Universe with Singleton]($m$untyped: scala.reflect.base.MirrorOf[U]): U#Type = {
val $u: U = $m$untyped.universe;
val $m: $u.Mirror = $m$untyped.asInstanceOf[$u.Mirror];
$u.TypeRef.apply($u.ThisType.apply($m.staticModule("scala").asModuleSymbol.moduleClass), $m.staticClass("scala.Function1"), scala.collection.immutable.List.apply[$u.Type]($m.staticClass("scala.Int").asTypeSymbol.asTypeConstructor, $m.staticClass("java.lang.String").asTypeSymbol.asTypeConstructor))
}
};
new $typecreator1()
})
});
<stable> <accessor> def t: reflect.runtime.universe.TypeTag[Int => String] = X.this.t
}
}
Parece ser mágica por completo compilador debido a que los tipos están codificados. Sin embargo, ¿hay alguna manera de hacerlo manualmente?
Veo, la Reflexión de Scala es mucho más complicada de lo que actualmente puedo pensar. Todavía tengo que pasar mucho tiempo hasta obtener lo que está pasando allí ... – sschaef
¿Podría explicar su caso de uso? La construcción de etiquetas de tipo (y, en consecuencia, tipos de Scala) sobre la marcha, especialmente desde Java, se ve muy duro. Tal vez las etiquetas de clase (que llevan solo una clase Java, no un tipo Scala) serían suficientes? –
No tengo un caso de uso;) Quería saber cómo funcionan las cosas y cómo usarlo/trabajar con él para su uso posterior ... – sschaef