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

如何使用Scala反射确定类型别名?,scala,scala-2.10,Scala,Scala 2.10,使用2.10中的Scala反射,如何确定类型是否为类型别名 以下操作不起作用: scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ scala> typeOf[String].typeSymbol.asType.isAliasType res46: Boolean = false 这是一个错误:由Type.typeSymbol自动取消对别名的引用这一事实引起

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

以下操作不起作用:

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

scala> typeOf[String].typeSymbol.asType.isAliasType
res46: Boolean = false
这是一个错误:由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.TypesType并使用typesymbolddirect。

这是一个错误:由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.TypesType并使用typeSymbolDirect。

请注意,除了scala.reflect.internal.TypesType之外,您还需要避免getClassByName:following,scala 2.12.1将确保:

, . 这使得在查询别名时getClassByName失败/GetClassified返回NoSymbol

当前行为可能会混淆类文件解析器:在解析 类,交叉检查验证pool.getClassSymbolnameIdx 返回当前正在分析的类的符号。 如果有 键入对链接类进行阴影处理的alias,在alias之后 返回一个无关的类

请注意,除了scala.reflect.internal.TypesType之外,还需要避免getClassByName:following,并且scala 2.12.1将确保:

, . 这使得在查询别名时getClassByName失败/GetClassified返回NoSymbol

当前行为可能会混淆类文件解析器:在解析 类,交叉检查验证pool.getClassSymbolnameIdx 返回当前正在分析的类的符号。 如果有 键入对链接类进行阴影处理的alias,在alias之后 返回一个无关的类