使用 2.10 中的 Scala 反射,如何确定一个类型是否是类型别名?
以下不起作用:
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> typeOf[String].typeSymbol.asType.isAliasType
res46: Boolean = false
使用 2.10 中的 Scala 反射,如何确定一个类型是否是类型别名?
以下不起作用:
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> typeOf[String].typeSymbol.asType.isAliasType
res46: Boolean = false
这是一个错误:httpsType.typeSymbol
://issues.scala-lang.org/browse/SI-6474 由自动取消引用别名的事实引起。
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
.
请注意,除了scala.reflect.internal.Types#Type
,您还需要避免getClassByName()
:在scala-dev 问题 248和PR 5482之后,Scala 2.12.1 将确保:
这使得查询别名时
getClassByName
失败/getClassIfDefined
返回。NoSymbol
当前的行为可能会混淆类文件解析器:解析类时,交叉检查会验证
pool.getClassSymbol(nameIdx)
返回当前正在解析的类的符号。
如果存在隐藏链接类的类型别名,则跟随别名将返回一个不相关的类。