如何在运行时获取泛型类的TypeTag

时间:2017-06-30 08:38:30

标签: scala reflection

Assume I have one class defined as below

class[T : ClassTag](val x : Int, val y : T) {

}

I have a utility method to use reflection and constructor parameters and create instance

def createInstance[T : ClassTage](cls : Class[_]) {
     val m = universe.runtimeMirror(getClass.getClassLoader)
    val clsSymbol = m.classSymbol(cls)
    val cm = m.reflectClass(clsSymbol)
    val ctorC = clsSymbol.toType.declaration(universe.nme.CONSTRUCTOR).asMethod
    val ctorm = cm.reflectConstructor(ctorC)

    val fullParams = ctorm.symbol.paramss

constructorFullParams.foreach(map => {
      map.foreach(param => {
        val name = param.name.decodedName.toString
        val ptype = param.typeSignature
        if (ptype.toString == "scala.reflect.ClassTag[T]") {
          //dosth()
        } 
      })
    })
}

如上所示,我只使用类型字符串值来确定类型是否为ClassTag,然后调用dosth()方法。虽然看起来不太好看。有没有更好的方法来检查?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过typeOf制作,考虑下一个代码快照:

    import scala.reflect.runtime.universe._

    class C[I]

    class A[T: TypeTag] {
      val tpe = typeOf[T]
    }

    val map = new A[Integer]
    val typeC = new A[C[String]]
    println(map.tpe)
    println(typeC.tpe)