代码之家  ›  专栏  ›  技术社区  ›  user79074

如何用upickle读写泛型类

  •  0
  • user79074  · 技术社区  · 6 年前

    假设我有以下特质:

    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的成员,但是我不知道合适的语法是什么?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Alexey Romanov    6 年前
    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
    
    推荐文章