我注意到 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/