2

これらの特性で始まるクラス階層があります。

sealed trait MessageBody
sealed trait MessageKey[T <: MessageBody]

のすべての直接サブクラスのリストを自動的に作成する必要がありMessageKeyます。あちこち検索して、私はこの点にたどり着きました:

object MessageKey {
  private def sealedDescendants[Root: TypeTag] = {
    val symbol = typeOf[Root].typeSymbol
    val internal = symbol.asInstanceOf[scala.reflect.internal.Symbols#Symbol]
    if (internal.isSealed) {
      val symbols = internal.sealedDescendants.map(_.asInstanceOf[Symbol]) - symbol
      val types = internal.sealedDescendants.filter(_.typeSignature.typeConstructor.baseTypeSeq.length > 3).map(_.typeSignature.typeConstructor.baseTypeSeq(3))
      (symbols zip types)
    } else {
      Set.empty
    }
  }
  // set of all keys (i.e., descendants of MessageKey
  private val allClassesAndTypes = sealedDescendants[MessageKey[_ <: MessageBody]]
  // map from key-strings to constructors of the MessageKey
  private val allObjects = (for ((aKey, aType) <- allClassesAndTypes) yield {
    print(aKey+": "+aType)
    val ctor = aKey.typeSignature.declaration(ru.nme.CONSTRUCTOR).asMethod
    val mirror = ru.runtimeMirror(getClass.getClassLoader)
    val cm = mirror.reflectClass(aKey.asClass)
    val ctorm = cm.reflectConstructor(ctor)
    val keyObj: MessageKey[_ <: MessageBody] = ctorm().asInstanceOf[MessageKey[_ <: MessageBody]]
    (keyObj.toString -> ctorm)
  }).toMap
}

このコードは、 type のオブジェクトを提供しますMessageKey[Nothing]。上記のように、なんとかType各キーの にたどり着きましたが、使い方がわかりません。

私は次のようなことをしたいと思います

    val keyObj: MessageKey[_ <: MessageBody] = ctorm().asInstanceOf[aType]

しかし、もちろん、そのままでは使えませんaType。どんな助けでも大歓迎です。

4

0 に答える 0