如何使用scala中的反射实例化泛型类

时间:2015-12-16 04:46:26

标签: scala generics reflection scala-reflect

我有一个以这些特征开头的类层次结构:

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。任何帮助表示赞赏。

0 个答案:

没有答案