2011-12-23 23 views

回答

6

大聲笑)發現我有一個解決方案已經在我的lib中實現。需要Scala 2.10。

def instantiate[T <: AnyRef : Manifest](params: Map[String, Any]): T = { 
    instantiate(Mirror.classToType(manifest[T].erasure), params).asInstanceOf[T] 
    } 
    def instantiate(tpe: Mirror.Type, params: Map[String, Any]) = { 
    val p = constructorParams(tpe, params) 
    require(
     params.size == p.size && 
     p.forall(p => params.contains(p.nameString)), 
     "Params map `" + params + "` doesn't match `" + p + "`" 
    ) 
    Option(Mirror.typeToJavaClass(tpe).getConstructor(p.map(p => Mirror.typeToJavaClass(p.tpe)): _*)) 
     .getOrElse(throw new RuntimeException("No appropriate constructor of `" + tpe + "` found")) 
     .newInstance(p.map(p => params(p.nameString).asInstanceOf[Object]): _*) 
    } 
    private def constructorParams(tpe: Mirror.Type, params: Map[String, Any]) = { 
    tpe.members.find(_.isConstructor).get.paramss(0) 
    } 
+0

在哪個版本的Scala中起作用? – 2011-12-23 06:04:52

+1

「需要Scala 2.10」 – 2011-12-23 06:35:29

1

我不認爲你可以在一個determistic方式,因爲參數的名稱不是字節代碼的一部分,併爲此在運行時沒有辦法知道哪些字符串參數自帶第一和第二。

相關問題