Scala中的动态泛型

时间:2011-11-10 17:13:38

标签: generics scala

我正在使用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"

这样的字符串动态构造的

3 个答案:

答案 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中的编译时。假装否则会让你和/或你的代码变得疯狂。