在Scala中,如何反映typedef(例如type Data=Map[String,Any])?

在Scala中,如何反映typedef(例如type Data=Map[String,Any])?,scala,reflection,Scala,Reflection,我正在写一些反射代码。我有一门课是这样的: case class Foo( info : Map[String,Any] ) ctor.typeSignature.paramLists.head.map( f => { println("F: "+f.typeSignature) }) 我对这门课的反思是这样的: case class Foo( info : Map[String,Any] ) ctor.typeSignature.paramLists.head.m

我正在写一些反射代码。我有一门课是这样的:

case class Foo(
   info : Map[String,Any]
)
ctor.typeSignature.paramLists.head.map( f => {
   println("F: "+f.typeSignature)
})
我对这门课的反思是这样的:

case class Foo(
   info : Map[String,Any]
)
ctor.typeSignature.paramLists.head.map( f => {
   println("F: "+f.typeSignature)
})
当定义如上所述时,我看到了我对成员信息类型的期望:Map[String,scala.Any]

但是。。。如果我这样做:

type Data = Map[String,Any]
case class Foo(
   info : Data
)
现在我看到的信息类型是:co.blocke.scalajack.test.v4.Data

如何判断上面的数据类型是否为typedef?如何查看它的解析结果?(上面剪辑中的“f”类型为universe.Symbol)


我错误地认为它是编译器candy,编译后它会解析为其定义的类型,但显然不是

您可以使用
dealias

type Data = Map[String,Any]
case class Foo(info: Data)
请原谅缺乏安全措施,但切中要害:

typeOf[Foo].typeSymbol
    .asClass
    .primaryConstructor
    .typeSignature
    .paramLists
    .head
    .head
    .typeSignature
    .dealias

res2: reflect.runtime.universe.Type = scala.collection.immutable.Map[String,scala.Any]

你是如何得到ctor的?
case sym if(sym.asClass.isCaseClass)=>val ctor=sym.asClass.primaryConstructor
whre sym是一个Type.typesymbol实际上我并没有做这些。。。但dealias绝对是我需要的帮助!从我最初的示例来看,这是有效的:
f.typeSignature.dealias
。如果类型是typedef,则会将其解读为实际类型。否则,对于任何其他类型,它似乎都是无害的no op(返回相同类型)。@Greg嗯,是的,所有这些对于您的目的来说都不是必需的,但我没有您的所有代码。因此,我只提供了一种从一端到另一端的方法来说明
dealias
。仍然感谢您的提示!Scala内部确实是一片丛林。