如何找到匹配某个签名的重载方法?

时间:2013-08-27 00:12:23

标签: scala reflection

我试图找到一个与给定的var-args参数匹配的任意类的构造函数。不幸的是,由于我很难理解Scala的反射API,因此我的进展很小。在检索所有可用构造函数的列表后,我无法识别与可用参数匹配的那个。

private lazy val `class` = mirror.staticClass( "myPackage.myClass" )

protected def reflect( arguments: Any* ): T =
{
    val constructor = `class`
        .toType
        .members
        .collect{ case method: MethodSymbol if method.isConstructor => method }
        .collectFirst[MethodSymbol]{ case _ => null  } // ???
        .getOrElse( throw new RuntimeException( "No valid constructor given" ) )

    mirror
        .reflectClass( `class` )
        .reflectConstructor( constructor )
        .apply( arguments: _* )
        .asInstanceOf[T]
}

1 个答案:

答案 0 :(得分:4)

我在关于scala reflection, part 1的博客文章中介绍了它。 MethodSymboltypeSignature,我们可以从中评估内容。例如,从帖子中,下面的方法将为您提供所有Int - 返回对象的方法:

def intMethods[T : TypeTag](v: T) = {
  val IntType = typeOf[Int]
  val vType   = typeOf[T]
  val methods = vType.members.collect {
    case m: MethodSymbol if !m.isPrivate => m -> m.typeSignatureIn(vType)
  }
  methods collect {
    case (m, mt @ NullaryMethodType(IntType))          => m -> mt
    case (m, mt @ MethodType(_, IntType))              => m -> mt
    case (m, mt @ PolyType(_, MethodType(_, IntType))) => m -> mt
  }
}