Почему на сравнение структурного равенства после десериализации с экземпляром класса случая влияет расположение определения класса случая внутри или вне другого класса.Например, утверждение в следующем фрагменте
package example
import org.json4s.DefaultFormats
import org.json4s.native.JsonMethods.parse
class Foo {
case class Person(name: String)
def bar = {
implicit val formats = DefaultFormats
val expected = Person(name = "picard")
val actual = parse("""{"name": "picard"}""").extract[Person]
assert(expected == actual, s"$expected == $actual")
}
}
object Main extends App {
(new Foo).bar
}
терпит неудачу с
`java.lang.AssertionError: assertion failed: Person(picard) == Person(picard)`
, в то время как оно проходит, если мы перемещаем Person
определение за пределы class Foo
, как, например,
case class Person(name: String)
class Foo {
def bar = {
...
assert(expected == actual, s"$expected == $actual")
}
}
Обратите внимание, что в обоих случаях десериализация кажется успешной, например,
assert(expected.name == actual.name)
выполняется независимо от case class Person
местоположения определения.
Возможно, на нее как-то влияетнеявное Manifest
передано extract
?