2.10のScalaReflectionでは、型が型エイリアスであるかどうかをどのように判断できますか?
以下は機能しません。
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> typeOf[String].typeSymbol.asType.isAliasType
res46: Boolean = false
2.10のScalaReflectionでは、型が型エイリアスであるかどうかをどのように判断できますか?
以下は機能しません。
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> typeOf[String].typeSymbol.asType.isAliasType
res46: Boolean = false
これはバグです: 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
です。