2

使用 2.10 中的 Scala 反射,如何确定一个类型是否是类型别名?

以下不起作用:

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

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

2 回答 2

4

这是一个错误: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.

于 2012-10-04T05:48:32.610 回答
0

请注意,除了scala.reflect.internal.Types#Type,您还需要避免getClassByName():在scala-dev 问题 248PR 5482之后,Scala 2.12.1 将确保:

这使得查询别名时getClassByName失败/getClassIfDefined返回。NoSymbol

当前的行为可能会混淆类文件解析器:解析类时,交叉检查会验证pool.getClassSymbol(nameIdx) 返回当前正在解析的类的符号。
如果存在隐藏链接类的类型别名,则跟随别名将返回一个不相关的类。

于 2016-12-26T22:40:40.490 回答