使用2.10中的Scala Reflection,如何确定类型是否为类型别名?
以下不起作用:
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> typeOf[String].typeSymbol.asType.isAliasType
res46: Boolean = false
答案 0 :(得分:4)
这是一个错误:https://issues.scala-lang.org/browse/SI-6474由Type.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 248和PR 5482,Scala 2.12.1将确保:
companionClass
returns a class, not a type alias,这会使
getClassByName
在查询别名时失败/getClassIfDefined
返回NoSymbol
。当前行为可能会混淆类文件解析器:解析时 类,交叉检查验证
pool.getClassSymbol(nameIdx)
返回当前正在解析的类的符号 如果有的话 类型别名,隐藏链接类,遵循别名 返回一个无关的班级。