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)