2

2.10のScalaReflectionでは、型が型エイリアスであるかどうかをどのように判断できますか?

以下は機能しません。

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

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

2 に答える 2

4

これはバグです: 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です。

于 2012-10-04T05:48:32.610 に答える