有没有一种我可以转换Scala case class实例的好方法,例如

case class MyClass(param1: String, param2: String)
val x = MyClass("hello", "world")

转换成某种映射,例如
getCCParams(x) returns "param1" -> "hello", "param2" -> "world"

它适用于任何案例类,而不仅仅是预定义的案例类。我发现您可以通过编写一个查询基础产品类的方法来提取案例类名称,例如
def getCCName(caseobj: Product) = caseobj.productPrefix
getCCName(x) returns "MyClass"

因此,我正在寻找类似的解决方案,但针对案例类字段。我以为解决方案可能必须使用Java反射,但是如果案例类的基础实现发生变化,我不希望编写可能会在将来的Scala版本中破坏的内容。

目前,我正在使用Scala服务器,并使用case类定义协议(protocol)及其所有消息和异常,因为它们是一个如此漂亮,简洁的构造。但是,然后我需要将它们转换为Java映射,以便通过消息传递层发送给任何客户端实现使用。我当前的实现只为每个案例类分别定义了一个翻译,但是最好找到一个通用的解决方案。

最佳答案

这应该工作:

def getCCParams(cc: AnyRef) =
  cc.getClass.getDeclaredFields.foldLeft(Map.empty[String, Any]) { (a, f) =>
    f.setAccessible(true)
    a + (f.getName -> f.get(cc))
  }

关于scala - 要在Scala中映射的案例类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1226555/

10-10 11:53