我有一个以这些特征开头的类层次结构:
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
}
此代码为我提供类型为MessageKey[Nothing]
的对象。如上所述,我以某种方式进入每个键的Type
,但我不知道如何使用它。
我想做点什么
val keyObj: MessageKey[_ <: MessageBody] = ctorm().asInstanceOf[aType]
但是,当然,我不能像那样使用aType
。任何帮助表示赞赏。