我正在使用3rd party library,方法的签名是:
def parse[A](input: String)(implicit mf: Manifest[A]): A = ...
我在运行时只知道A
。如何使用parse
表示为字符串来调用上面的A
方法?
唯一的选项是否与我的所有域对象匹配?
E.g。
object ParserHelper {
def apply(clazz: String, arg: String) = clazz match {
case "DomainObjectA" => parse[DomainObjectA](arg)
case "DomainObjectB" => parse[DomainObjectB](arg)
case _ => throw new RuntimeException("Domain class %s not mapped" format clazz)
}
}
...然后拨打ParserHelper("com.example.DomainObjectA", "some argument")
?
即。我怎么称呼parse[???]("")
在哪里?是在运行时从"com.example.SomeDomainObject"
?
答案 0 :(得分:3)
我认为这是不可能的。你需要在编译时知道[A],你只能在运行时知道。
答案 1 :(得分:1)
首先,你需要明确地传递清单:我猜你至少可以获得一些Class[_]
(Class.forName
,或任何基于你的clazz
参数的东西。您可以使用ClassManifest.classType(theClass)
构建清单。你得到一个Manifest[_]
。
然后你只需制作一个接受Manifest[_]
def parseUntyped(input: String, m: Manifest[_]) = parse(input)(m)
parse(input)(m)
输入正确。鉴于m如果是某种类型的清单,则该呼叫是正确的。当然,parseUntyped
的返回类型为Any
,您必须将其转换回您想要的内容。
答案 2 :(得分:0)
使这些类扩展一个特征并使用该特征作为您的类型参数。请记住,类型是Scala中的编译时。假装否则会让你和/或你的代码变得疯狂。