在Scala宏中,如何从WeakTypeTag中检索完整类型信息?

我正在编写宏将类型描述转换为单例类型:

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")]

所以我的问题是:

  1. 现在是编译时,类型信息应该是完全可见的,为什么T1和T2被擦除了?

  2. 如何修复此程序以提供正确的类型信息:

shapeless.Witness.Aux[String("Int ^^ String")]

?

以上是在Scala宏中,如何从WeakTypeTag中检索完整类型信息?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>