Generics Scala中的动态泛型
我使用的是,方法的签名是:Generics Scala中的动态泛型,generics,scala,Generics,Scala,我使用的是,方法的签名是: def parse[A](input: String)(implicit mf: Manifest[A]): A = ... 我只知道运行时的A。如何使用表示为字符串的A调用上面的parse方法 唯一选项是否与我的所有域对象匹配 例如 …然后调用ParserHelper(“com.example.DomainObjectA”,“some argument”) 例如,我如何调用parse[???](“”)where???是在运行时从字符串动态构造的,比如“com.ex
def parse[A](input: String)(implicit mf: Manifest[A]): A = ...
我只知道运行时的A
。如何使用表示为字符串的A
调用上面的parse
方法
唯一选项是否与我的所有域对象匹配
例如
…然后调用ParserHelper(“com.example.DomainObjectA”,“some argument”)
例如,我如何调用
parse[???](“”)
where???是在运行时从字符串动态构造的,比如“com.example.SomeDomainObject”
?,我认为这是不可能的。你需要在编译时知道一些只有在运行时才知道的东西。首先,你需要明确地传递清单:我想你至少可以掌握一些类[\u]
(Class.forName
,或者任何基于clazz
参数的东西)。您可以使用ClassManifest.classType(类)
构建清单。您将获得一个清单[\u]
然后,您只需创建一个例程,该例程将接受清单[\u]
def parseUntyped(input: String, m: Manifest[_]) = parse(input)(m)
parse(input)(m)
输入正确。假设m是某种类型的清单,则调用是正确的。当然,parseUntyped
的返回类型是Any
,您必须将其转换回您想要的类型 使这些类扩展一个trait并将该trait用作您的类型参数。记住,类型在Scala中是编译时的。假装不这样做会让你和/或你的代码发疯。泛型是一种编译时类型检查机制。在运行时生成泛型类型毫无意义。每个类型的清单是否不同?如果是这样,您可以尝试创建一个映射,其中键是类名,并显式地将manifest参数传递给parse[?](arg,manifest)。我不知道这是否有效,但也许值得一试。谢谢你的评论,凯文。请参阅我对已接受答案的评论。我已经看这个监视器太久了:)这是真的,我意识到“我如何在运行时解析一些我需要知道的东西(在编译时)”,所以我不妨继续,用我所有的域对象充实ParserHelper,幸运的是它不是数不清的:)+1这非常有效,谢谢。现在,我可以将新的域类作为字符串添加到映射中,而不必将它们全部放在类路径上。
def parseUntyped(input: String, m: Manifest[_]) = parse(input)(m)