Scala 如何获取宏typeparameter的类型

Scala 如何获取宏typeparameter的类型,scala,scala-macros,Scala,Scala Macros,我试图实现一个宏,它将生成新类,扩展现有类,作为参数给出: def impl[T: c.WeakTypeTag](c: Context)(p: c.Expr[T]): c.Expr[() => T] = { val t = weakTypeOf[T] q"class Too extends $t {..}; () => new Too()" } 但尝试运行此类宏会导致: [error] Main.scala: exception during macro expansion

我试图实现一个宏,它将生成新类,扩展现有类,作为参数给出:

def impl[T: c.WeakTypeTag](c: Context)(p: c.Expr[T]): c.Expr[() => T] = {
  val t = weakTypeOf[T]
  q"class Too extends $t {..}; () => new Too()"
}
但尝试运行此类宏会导致:

[error] Main.scala: exception during macro expansion:
[error] scala.ScalaReflectionException: object com.foo.MyClass in compiler mirror not found.
[error]         at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:129)
[error]         at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:29)
[error]         at impl(Macro.scala:54)

你似乎没有提供足够的信息来重现你的错误。以下代码在2.13中编译时没有错误

宏/src/main/scala/macros.scala

core/src/main/scala/App.scala

导入宏_
对象应用程序{
类MyClass
太(新MyClass)//App$$$Lambda$3/1967205423@77f03bb1
too(新MyClass)(//应用程序$too$1@77f03bb1
}
//警告:scalac:{
//类也扩展了App.MyClass{
//def()={
//超级(;
//      ()
//    };
//    
//  };
//(()=>也是新的())
//}
import scala.language.experimental.macros
import scala.reflect.macros.blackbox

object Macros {
  def too[T](p: T): () => T = macro impl[T]

  def impl[T: c.WeakTypeTag](c: blackbox.Context)(p: c.Expr[T]): c.Expr[() => T] = {
    import c.universe._
    val t = weakTypeOf[T]
    c.Expr[() => T](q"class Too extends $t {}; () => new Too()")
  }
}
import Macros._

object App {
  class MyClass

  too(new MyClass) //App$$$Lambda$3/1967205423@77f03bb1

  too(new MyClass)() //App$Too$1@77f03bb1
}

//Warning:scalac: {
//  class Too extends App.MyClass {
//    def <init>() = {
//      super.<init>();
//      ()
//    };
//    <empty>
//  };
//  (() => new Too())
//}