ネストされた型の場合、封印されたスーパートレイトからのリフレクションを介してシングルトンインスタンスを回復するのに問題があります。
import reflect.runtime.universe._
import reflect.runtime.{currentMirror => cm}
object Foo {
case object Bar extends Foo
}
sealed trait Foo
def getModule(tpe: Type): Any = {
val classSymbol = tpe.typeSymbol.asClass
val compSymbol = classSymbol.companionSymbol // gives <none> !
val moduleSymbol = compSymbol.asModule
val moduleMirror = cm.reflectModule(moduleSymbol)
moduleMirror.instance
}
val subs = typeOf[Foo].typeSymbol.asClass.knownDirectSubclasses
val tpeOther = subs.last.asType.toType
val res = getModule(tpeOther)
println(res)
への呼び出しcompanionSymbol
は「none」を生成し、asModule
失敗します
scala.ScalaReflectionException: <none> is not a module
(私はユージーン・ブルマコによるこの要点から体を取り出しました。)
に変更すると
sealed trait Foo
case object Bar extends Foo // not nested in object Foo
できます...