加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

泛型 – 在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失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读