如何使用Scala Reflection确定类型别名?

时间:2012-10-03 23:44:16

标签: scala scala-2.10

使用2.10中的Scala Reflection,如何确定类型是否为类型别名?

以下不起作用:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[String].typeSymbol.asType.isAliasType
res46: Boolean = false

2 个答案:

答案 0 :(得分:4)

这是一个错误:https://issues.scala-lang.org/browse/SI-6474Type.typeSymbol自动取消引用别名的事实引起。

scala> showRaw(typeOf[String])
res0: String = TypeRef(SingleType(ThisType(scala), scala.Predef), newTypeName("String"), List())

scala> typeOf[String].typeSymbol
res1: reflect.runtime.universe.Symbol = class String

scala> typeOf[String].typeSymbol.asType.isAliasType
res2: Boolean = false

scala> val TypeRef(_, sym, _) = typeOf[String]
sym: reflect.runtime.universe.Symbol = type String

scala> sym.asType.isAliasType
res3: Boolean = true

由REPL打印输出部分提供的解决方法是执行手动模式匹配并提取基础符号。另一种方法是转换为scala.reflect.internal.Types#Type并使用typeSymbolDirect

答案 1 :(得分:0)

请注意,除scala.reflect.internal.Types#Type之外,您需要避免getClassByName():关注scala-dev issues 248PR 5482,Scala 2.12.1将确保:

  

这会使getClassByName在查询别名时失败/ getClassIfDefined返回NoSymbol

     

当前行为可能会混淆类文件解析器:解析时   类,交叉检查验证pool.getClassSymbol(nameIdx)   返回当前正在解析的类的符号   如果有的话   类型别名,隐藏链接类,遵循别名   返回一个无关的班级。