2

ネストされた型の場合、封印されたスーパートレイトからのリフレクションを介してシングルトンインスタンスを回復するのに問題があります。

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

できます...

4

1 に答える 1