gpt4 book ai didi

generics - 在 Scala 中获取泛型类型的特定简单名称

转载 作者:行者123 更新时间:2023-12-03 14:41:28 24 4
gpt4 key购买 nike

是否可以在 Scala 中获取泛型类的类型名称?我知道这在带有类型删除的 Java 中是不可能的,但我希望 Scala 会是一个不同的情况。

目前我必须做类似的事情:

trait Model
case class User(id: String) extends Model

def fromMap[M<:Model : Manifest](data: Map[String, String], modelType: String) = {
modelType match {
case "user" => User(data.get("id").get)
}
}

val user = fromMap[User](Map("id" -> "id1"), "user")

显然,如果我可以计算出“用户”而不必传入它会更容易。

最佳答案

可以使用 manifest.erasure.getName 从 Manifest(或 ClassManifest)中检索类名。 (删除是 Class 实例)。例如

def className[A : ClassManifest] = classManifest[A].erasure.getName

编辑 :看到德里克的回答,这使得这个带有erasure.getName 的东西看起来很愚蠢。我没有考虑 toString。我仍然希望接下来的内容可能会引起人们的兴趣

使用 ClassManifest的区别和 Manifest是在 Manifest对于泛型类,类型参数保证可用,而它们在 ClassManifest 中尽最大努力。 (比较两个类中 typeParameters 的签名)。这种保证的缺点是 ManifestClassManifest 的情况下可能不隐式可用将是。

您是否考虑过使用类型类?
trait BuilderFromMap[A] {def build(data: Map[String, String]): A} 
// or better, return Option[A], accounting for possible failure
object User {
implicit val Builder extends BuilderFromMap[User] {...}
}
def fromMap[A](data: Map[String, String])(implicit builder: BuilderFromMap[A])
= builder.build(data)

这样,调用 fromMap只有在 Builder 时才会编译可用于这个特定的类,而不是失败 MatchError .

关于generics - 在 Scala 中获取泛型类型的特定简单名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7175681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com