如何反映scala元组类型变量?

时间:2014-04-27 06:32:44

标签: scala reflection

我正在使用2.10.4。

我需要反映一个Tuple的类型变量,以便我可以动态创建一个Tuple实例并使用正确类型的参数。到目前为止,我只能设法反映Type变量(T1,T2),如下面的测试用例中所示,因此我无法阻止将不需要的类型值插入到新实例化的元组中。

非常感谢任何帮助

package scala.reflect

import org.scalatest.FunSuite

class ReflectTupleType extends FunSuite {

    import scala.reflect.runtime._
    import scala.reflect.runtime.universe._

  def reflect[T](arg1: Any, arg2: Any)(implicit tag: TypeTag[T]): T = {

      val ru = scala.reflect.runtime.universe
      val ctxcl = Thread.currentThread().getContextClassLoader()
      val mirr = runtimeMirror(ctxcl)

      val classSym = typeOf[T].typeSymbol.asClass
      val classMirr = mirr.reflectClass(classSym)

      val ctorMethodSym = typeOf[T].declaration(nme.CONSTRUCTOR).asMethod
      val paramTypeList = ctorMethodSym.paramss.head map (_.typeSignature)
      println("paramTypeList " + paramTypeList) //Type variables not Type

      val ctorm = classMirr.reflectConstructor(ctorMethodSym)
      val tuple2 = ctorm(arg1, arg2)
      tuple2.asInstanceOf[T]
  }

  test("tuple") {

      val validTup2 = reflect[(String, Int)]("Test", 1) //This is valid

      println("Should be valid " + validTup2)

      val invalidTup2 = reflect[(String, Int)]("Test", "a")  //This is not valid - wrong type

      println("Should be invalid " +invalidTup2)
  }    
}

0 个答案:

没有答案