在 Scala 中,我如何反映 typedef(例如 type Data = Map[String,Any])?
In Scala how can I reflect on a typedef (eg. type Data = Map[String,Any])?
我正在写一些反射代码。我有一个 class 这样的:
case class Foo(
info : Map[String,Any]
)
我是这样想的class:
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
我怎么知道像上面的 Data 这样的类型实际上是一个 typedef 我怎么知道它解析成什么?('f' 中的类型上面的剪辑是 universe.Symbol)
我误以为它是编译器糖果,编译后它会解析为它定义的类型,但显然不是!
您可以使用 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]
我正在写一些反射代码。我有一个 class 这样的:
case class Foo(
info : Map[String,Any]
)
我是这样想的class:
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
我怎么知道像上面的 Data 这样的类型实际上是一个 typedef 我怎么知道它解析成什么?('f' 中的类型上面的剪辑是 universe.Symbol)
我误以为它是编译器糖果,编译后它会解析为它定义的类型,但显然不是!
您可以使用 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]