泛型 – 在Scala中获取泛型类型的特定简单名称
发布时间:2020-12-16 18:21:55 所属栏目:安全 来源:网络整理
导读:是否可以在 Scala中获取泛型类的类型名称?我知道在类型擦除的 Java中这是不可能的,但我希望Scala是一个不同的情况. 目前我必须做类似的事情: trait Modelcase class User(id: String) extends Modeldef fromMap[M:Model : Manifest](data: Map[String,Stri
是否可以在
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(擦除是Class实例)从Manifest(或ClassManifest)中检索类名.例如
def className[A : ClassManifest] = classManifest[A].erasure.getName 编辑:看过Derek的回答,这使得erasure.getName这个东西看起来相当愚蠢.我不考虑toString.我仍然希望以下内容可能会引起关注 使用ClassManifest和Manifest之间的区别在于,在通用类的Manifest中,类型参数保证可用,而它们是ClassManifest中的最佳工作(比较两个类中的typeParameters的签名).这种保证的缺点是,在ClassManifest可能的情况下,Manifest可能不会隐式可用. 您是否考虑过使用类型类? 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) 这样,只有当Builder可用于此特定类时,才会编译对fromMap的调用,而不是使用MatchError失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 【黑马Android】(14)webservice概念/调用/wsdl接
- Bootstrap学习总结笔记(23)-- 基本插件之轮播幻
- Bootstrap 实例 - 弹出框(Popover)插件
- 单元测试 – 如何使用蛋糕模式进行模拟
- 社会化企业应用(Social Enabled Enterprise App
- django-在此Dockerfile中在哪里创建Postgres用户
- JXTA promotion ,1 bootstrap
- class – Scala Builder Pattern:涉及类型T的非
- scala中一个奇怪的NullPointerException
- JAX-WS 和 XFire 以及CXF比较
热点阅读