Как создать универсальный класс, используя отражение в scala
У меня есть иерархия классов, начинающаяся с этих черт:
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
там просто так. Любая помощь приветствуется.