我正在编写宏来将类型描述转换为单例类型:
object Type2String {
def apply[I]: Witness.Lt[String] = macro Macros.apply[I]
final class Macros(val c: whitebox.Context) extends MWithReflection {
import c.universe._
def apply[A: WeakTypeTag]: Tree = {
val tt: Type = weakTypeOf[A]
val str = tt.toString
// val vv = viz(tt)
q"shapeless.Witness.mkWitness[$str]($str)"
}
}
}
问题是因为 A 只有一个 WeakTypeTag。它无法从泛型类型中提取正确的信息:
case class ^^[T1, T2]() {
final val wTSelf = Type2String[^^[T1, T2]]
}
val e1 = ^^[Int, String]()
e1.wTSelf
这给出了错误的见证类型:shapeless.Witness.Aux[String("T1 ^^ T2")]
所以我的问题是:
是编译时,类型信息应该是完全可见的,为什么 T1 和 T2 被擦除了?
如何修复此程序,使其提供正确的类型信息:
shapeless.Witness.Aux[String("Int ^^ String")]
?