我想基于具有特定子项列表的节点创建新的scala.xml.Elem。 这将是递归替换函数的返回情况。
val childs: Seq[Node] = update(node.child)
new Elem(node.prefix, node.label, node.attributes, node.scope, true, childs)
此构造提供编译器错误:
Error:(50, 11) overloaded method constructor Elem with alternatives:
(prefix: String,label: String,attributes: scala.xml.MetaData,scope: scala.xml.NamespaceBinding,child: scala.xml.Node*)scala.xml.Elem <and>
(prefix: String,label: String,attributes1: scala.xml.MetaData,scope: scala.xml.NamespaceBinding,minimizeEmpty: Boolean,child: scala.xml.Node*)scala.xml.Elem
cannot be applied to (String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Boolean, Seq[scala.xml.Node])
new Elem(node.prefix, node.label, node.attributes, node.scope, true, childs)
^
问题与vararg处理有关,我无法理解为什么会出现此错误。有什么想法吗?
更新 我能够通过以下丑陋的构造解决问题:
val childs: Seq[Node] = update(node.child)
Elem(node.prefix, node.label, node.attributes, node.scope, true)
.copy(node.prefix, node.label, node.attributes, node.scope, true, childs)
首先创建没有孩子的elem,然后复制并添加孩子。复制方法定义没有varargs。
答案 0 :(得分:2)
您的scope
和minimizeEmpty
参数的顺序错误。
尝试像这样调用它(注意我也使用了伴侣对象,保存了几个字符):
Elem(node.prefix, node.label, node.attributes, node.scope, true, childs)
问题更新后 更新 - 啊现在我看到了您的问题 - childs
是Seq[Node]
,但Elem
构造函数方法预期Node*
;所以你可以使用:
Elem( node.prefix, node.label, node.attributes, node.scope, true, childs:_* )