首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用upickle读/写泛型类

如何使用upickle读/写泛型类
EN

Stack Overflow用户
提问于 2019-01-24 23:40:12
回答 1查看 129关注 0票数 0

假设我有以下特征:

代码语言:javascript
复制
trait T {
    val x: Int
}

def foo(i: Int): T

我敢打赌,我能够使用upickle写和读这个特征,而不需要知道具体的类是什么。例如:

代码语言:javascript
复制
upickle.default.write(foo(3))

这样我就可以在其他地方将foo定义为:

代码语言:javascript
复制
case class A(x: Int)

def foo(i: Int): T = A(i)

我在想,我需要定义一个隐式Writer作为T的成员,但是我不知道合适的语法是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-01-25 01:00:18

代码语言:javascript
复制
trait T {
  val x: Int
}
object T {
  implicit val rw: ReaderWriter[T] = ...
}

问题是要把什么放到...部件中:如果你有一个T值,你可以只存储它的x

代码语言:javascript
复制
... = readwriter[Int].bimap[T](
  t => t.x,
  i => new T { val x = i }
)

这种解决方案的问题是,读取写入的A(3)不会返回A。如果不密封T或者只处理一组特定的子类,这是无法解决的。

您也可以在编写时包含一个类名,但是如果这个类除了x之外还有其他字段要存储,那就没有什么用了:

代码语言:javascript
复制
class B(override val x: Int, y: String) extends T

如果Tsealed,则只需编写

代码语言:javascript
复制
... = macroRW
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54350317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档