如何为使用Scala工具箱在运行时定义的类的方法反映具体的返回类型?

如何为使用Scala工具箱在运行时定义的类的方法反映具体的返回类型?,scala,reflection,scala-reflect,Scala,Reflection,Scala Reflect,当反映类Cls的foo()方法时,我们可以使用以下方法轻松地获得具体的返回类型 Cls类{ def foo()= 名单(“A”、“B”) } val classType=ru.typeOf[Cls] val classMirror=toolbox.mirror.reflectClass(classType.typeSymbol.asClass) val ctorSymbol=classType.decl(ru.termNames.CONSTRUCTOR).asMethod val methodS

当反映类
Cls
foo()
方法时,我们可以使用以下方法轻松地获得具体的返回类型

Cls类{
def foo()=
名单(“A”、“B”)
}
val classType=ru.typeOf[Cls]
val classMirror=toolbox.mirror.reflectClass(classType.typeSymbol.asClass)
val ctorSymbol=classType.decl(ru.termNames.CONSTRUCTOR).asMethod
val methodSymb=classType.decl(ru.TermName(“foo”)).asMethod
val ctor=classMirror.reflectConstructor(ctorSymbol)
val实例=ctor()
val im=toolbox.mirror.reflect(实例)
val foo=即时反射法(methodSymb)
println(foo())//列表(A,B)
println(methodSymb.returnType)//列表[字符串]
但是,如果我们在运行时通过工具箱定义类
Cls
,然后使用相同的方法反射过程,我们将只获得
foo()
方法的抽象返回类型(
List

导入ru_
瓦尔树=
q“类Cls{
def foo()=
名单(“A”、“B”)
}“.asInstanceOf[ru.ClassDef]
val classSymbol=toolbox.define(tree).asClass
val classType=classSymbol.selfType
val classMirror=toolbox.mirror.reflectClass(classType.typeSymbol.asClass)
val ctorSymbol=classType.decl(ru.termNames.CONSTRUCTOR).asMethod
val methodSymb=classType.decl(ru.TermName(“foo”)).asMethod
val ctor=classMirror.reflectConstructor(ctorSymbol)
val实例=ctor()
val im=toolbox.mirror.reflect(实例)
val foo=即时反射法(methodSymb)
println(foo())//列表(“A”、“B”)
println(methodSymb.returnType)//列表
为什么这些代码片段会产生不同的结果


如果使用工具箱在运行时定义了
Cls
,我们如何反映
foo()
方法的具体返回类型呢?

我猜问题在于类型擦除

试着替换

val classType = classSymbol.selfType


然后
methodSymb.returnType
List[String]

谢谢您的修复!您是否愿意分享更多的细节(或指向文档的指针),解释为什么这两个选项的类型擦除不同?不管哪种方式都可以接受。@Erp12好吧,我不是100%确定(有必要更深入地调试工具箱代码生成),但我的猜测如下。让我们考虑一下代码工作流。主代码有编译时和运行时。当工具箱位于主代码的运行时中时,会出现工具箱的编译时和运行时。在工具箱编译时,返回类型是
List[String]
,在工具箱运行时,由于擦除,返回类型只是
List[\u]
。@Erp12我怀疑当我们执行
classSymbol.selfType
时,我们在工具箱运行时使用
toolbox.eval(q“scala.reflect…
我们从工具箱编译时捕获一个类型(
tb.eval(tree))
tb.compile(tree).apply()
)。工具箱不允许控制更好的代码生成。我猜是手动代码生成(请参阅)您最好控制编译和运行代码的方式。@Erp12在那个问题中,我已经遇到过一种情况,当时我必须使用
eval
从工具箱中捕获一些类型信息(请参阅我用
tb.eval(q“…TypeInformation.of(classOf…
)回答该问题时的代码片段)。
val classType = toolbox.eval(q"scala.reflect.runtime.universe.typeOf[$classSymbol]").asInstanceOf[ru.Type]