【问题标题】:How to reuse Scala type class based API from typeless REST API如何从无类型 REST API 重用基于 Scala 类型类的 API
【发布时间】:2016-11-06 23:59:54
【问题描述】:

假设您有一个旨在以编程方式使用的 API,以便调用者有可用的类型信息并可以调用def write[T : Writer](x: T)

但现在您想从无类型的 REST API 中重用这些类型类,而我们手头没有类型信息,因为 REST API 使用 ID...

现在,鉴于T 的所有实例都是预先实例化的,我们可以将TypeTag 关联到它,因此您的REST API 拥有id -> instance-of-TMap,它可以从该实例中获取TypeTag解决可以编写它的正确类型类...

问题是,如何隐式解析只有TypeTags 可用的类型类?

【问题讨论】:

  • 这听起来像是一个“XY 问题”。你真正想达到什么目标? TypeTag 使用反射,它不会给您任何编译时安全性。没有编译时安全性,为什么还要考虑类型?

标签: scala types typeclass


【解决方案1】:

如果您无论如何都要缓存所有实例,那么这样的事情可能会起作用:

trait Entity {
  val id: Long
}

trait Writer[T] {
  def write(x: T): String
}

var cache = Map[Long, (Any, () => String)]()

def cacheObj[T <: Entity](x: T)(implicit writer: Writer[T]): Unit = {
  cache = cache + (x.id -> (x, () => writer.write(x)))
}

def serveObj(id: Long): String = {
  val (x, write) = cache(id)
  write()
}

【讨论】:

  • 嘿,我不能那样做。 Writer 实际上可以做很多不同的事情,它不像序列化程序。默认情况下只有 10 个实体,然后用户提供的实体也必须提供 Writer 类型类证据。想象一下,Typeclass 类似于 ViewIntrospector,它可以内省 s3、ElasticSearch 等视图
  • 您能否提供一个代码示例,说明您想在 REST API 中对您的实体和编写器执行什么操作?
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 2011-04-04
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
相关资源
最近更新 更多