Ваша интерпретация верна.Дочерний элемент fromString
равен scala.xml.Text
, что расширяет scala.xml.Atom[String]
:
scala> fromString.child(0).getClass.getName
res1: String = scala.xml.Text
scala> fromString.child(0).asInstanceOf[xml.Atom[_]].data.getClass.getName
res2: String = java.lang.String
А дочерний элемент fromBoolean
равен scala.xml.Atom[Boolean]
:
scala> fromBoolean.child(0).getClass.getName
res3: String = scala.xml.Atom
scala> fromBoolean.child(0).asInstanceOf[xml.Atom[_]].data.getClass.getName
res4: String = java.lang.Boolean
Так что data
дочернего элемента fromString
Atom
имеет тип String
, а data
of fromBoolean
s Atom
имеет тип Boolean
.Реализация равенства Atom
(scala.xml.Atom#strict_==
) просто сравнивает data
напрямую, и поэтому String
и Boolean
сравнивают неравномерно.
Я не уверен, какова цель различениятипы Atom
данных.Мне кажется, что Atom
должен сравнить toString
значения своих данных в любом случае.Так что это может быть ошибкой.
В качестве обходного пути я могу посоветовать явно преобразовать значения атомов в String
.Равенство работает в этом случае:
scala> <b>{true.toString}</b> == <b>true</b>
res5: Boolean = true
Сравнение Scala xml имеет больше причуд:
scala> <foo:b xmlns:foo="foo"/> == <foo:b xmlns:foo="bar"/>
res6: Boolean = true
scala> <b>{"<"}</b> == <b><</b>
res7: Boolean = false
scala> <b>></b> == <b>></b>
res8: Boolean = false
Так что, возможно, стоит попробовать выполнить сравнение вручную.