これらの特性で始まるクラス階層があります。
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
。どんな助けでも大歓迎です。