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