scala - 如何用 upickle 读/写一个泛型类
问题描述
假设我具有以下特征:
trait T {
val x: Int
}
def foo(i: Int): T
我敢打赌,在不知道具体课程是什么的情况下,我可以使用 upickle 来编写和阅读这个特性。例如:
upickle.default.write(foo(3))
这样我就可以在其他地方将 foo 定义为:
case class A(x: Int)
def foo(i: Int): T = A(i)
我在想我需要将隐式 Writer 定义为 T 的成员,但我不知道合适的语法是什么?
解决方案
trait T {
val x: Int
}
object T {
implicit val rw: ReaderWriter[T] = ...
}
问题是该...
部分的内容:如果你有一个T
值,你可以只存储它x
:
... = readwriter[Int].bimap[T](
t => t.x,
i => new T { val x = i }
)
此解决方案的问题是读取书面文件A(3)
不会返回A
. 如果不进行T
密封或仅以其他方式处理一组特定的子类,这实际上是无法解决的。
您也可以在编写时包含一个类名,但如果该类有除存储之外的任何字段,那将无济于事x
:
class B(override val x: Int, y: String) extends T
如果T
是 sealed
,你就写
... = macroRW
推荐阅读
- oracle - LocalDateTime 映射到 Oracle DATE,但不映射到 H2 DATE
- c# - 在 C# 中将用户名转换为 SID
- cmake - 为什么 CMAKE 安装的目标无法链接到提供的库?
- javascript - 如何标记在 JavaScript 画布上创建的框?
- java - 在不更改 UI android 的情况下,究竟需要如何以及在何处更改以接受来自重音内容的正常字符搜索
- libraries - 为什么语言需要库?
- html - 如何使我的下拉菜单在两行上工作?
- markdown - 可折叠部分的内容(
...) 在 GitHub 存储库中呈现降价,但不在 GitHub 页面上
- ruby - 即使 ruby 和 bundler 已更新,Docker 仍返回非零代码
- javascript - 如何在 HTML 文件中使用 Javascript 替换字符?