如何在Scala宏中构造通配符类型?

如何在Scala宏中构造通配符类型?,scala,scala-macros,existential-type,Scala,Scala Macros,Existential Type,我无法找到如何在Scala宏中以编程方式构造存在类型 例如,假设我有一个ClassSymbol,它表示一个具有一个类型参数的类C[T] 现在,我如何通过编程来构造类型C[\up>,据我所知,你需要自己创建量化符号,手动设置它们的签名。下面是我编译typeOf[C]时打印的-Ymacro-debug-lite的节略和改编版本非常感谢。虽然我不确定它是否能作为所有者与NoSymbol一起使用。我记得我尝试过类似的方法,但遇到了一些崩溃。为了让代码片段更清楚一点,标志实际上是延迟的|存在的。不幸的是后

我无法找到如何在Scala宏中以编程方式构造存在类型

例如,假设我有一个
ClassSymbol
,它表示一个具有一个类型参数的类
C[T]


现在,我如何通过编程来构造类型
C[\up>,据我所知,你需要自己创建量化符号,手动设置它们的签名。下面是我编译
typeOf[C]时打印的
-Ymacro-debug-lite
的节略和改编版本非常感谢。虽然我不确定它是否能作为所有者与
NoSymbol
一起使用。我记得我尝试过类似的方法,但遇到了一些崩溃。为了让代码片段更清楚一点,标志实际上是
延迟的
|
存在的
。不幸的是后者在公共API中不可用。Jason建议e> typer.packSymbols(sym.typeParams,sym.tpe)
(这需要强制转换才能到达
c.callsiteTyper),然后如果需要修改下划线的类型边界,请使用存在类型的量词的
setTypeSignature`。
def apply(quantified: List[Symbol], underlying: Type): ExistentialType
class C[T]

object Test extends App {
  import scala.reflect.runtime.universe._
  val c = typeOf[C[_]].typeSymbol
  val targ = build.newNestedSymbol(NoSymbol, newTypeName("_$1"), NoPosition, build.flagsFromBits(34359738384L), false)
  build.setTypeSignature(targ, TypeBounds(typeOf[Nothing], typeOf[Number]))
  println(ExistentialType(List(targ), TypeRef(c.owner.asClass.thisPrefix, c, List(TypeRef(NoPrefix, targ, Nil)))))
}