我有兴趣手动创建一个TypeTag(从2.10M5开始):
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导致
package {
object X extends scala.AnyRef {
def (): X.type = {
X.super.();
()
};
import scala.reflect.runtime.`package`.universe._;
def tt[A >: Nothing <: any a evidence reflect.runtime.universe.typetag scala.reflect.runtime.>
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 (): $typecreator1 = {
$typecreator1.super.();
()
};
def apply[U >: Nothing <: scala.reflect.base.universe with singleton scala.reflect.base.mirrorof u>
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()
})
});
def t: reflect.runtime.universe.TypeTag[Int => String] = X.this.t
}
}
它似乎完全是编译器魔术,因为类型是硬编码的.不过有没有办法手动执行此操作?