scala - 为什么 scala.xml.Atom 类型参数化?

标签 scala

我注意到 scala.xml.Atom接受一个类型参数 A ,即使它的所有子类都扩展了 Atom[String] ,并且文档说“Atom 类为文本 (PCDATA) 提供了一个 XML 节点”。

是否有使用字符串以外的类型参数实例化 Atom 的合法用例?

更具体地说,我有兴趣使用 Scala XML 文字来定义一种很好的 DSL,用于定义基于内存树的文档结构,其中许多节点将是现有的 Scala 类。使用 <document>{new JButton("Hi")}</document> 会 super 好用并访问 Atom[JButton] 中的非文本数据无需为每个现有类定义 XML 序列化方案。

这是一个合法的用例,还是我滥用了 Scala 的 XML 库的当前实现?

最佳答案

如果您查看 sources原因揭晓。 Atom 是通用的,因为它将传递的对象转换为字符串。所以你可以通过一个 JButton到它,但它只会调用它的 toString 方法。 (第 48 行很重要)

我想可以从原子中取回数据:

val doc = <document>{ 42 }</document>

doc.child.head match { 
  case i: Atom[Int] => i.data / 7 
  case _ => error("Unsupported type")
}

返回 6 .所以你的计划会奏效。我仍然认为基于抽象类和案例类的树将是更好的选择,因为使用您的方法,所有类型安全都消失了,因为您可以传入所有内容,因此直到运行时才会发现类型错误。

关于scala - 为什么 scala.xml.Atom 类型参数化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5145387/

相关文章:

scala - 使用 Scala 在 Spark 中创建映射值

scala - gradle 4.3 修复了 play 2.6.6 和 scala 2.12 的问题吗?

scala - 如何从spark数据框中过滤掉空值

scala - 使用来自猫效应的种族可防止应用程序退出

scala - 有没有等效于 Scala 的 Iterable.maxBy 的 Haskell?

java - 如何将scala代码转换为java来读取xml文件

Scala 映射函数删除字段

scala - 如何从每一行的列中提取特定元素?

scala - df.select() 和 df.agg() 有什么区别?

ScalaTest AsyncFunSuiteLike 多个断言