为什么在将案例类定义反序列化之后,案例类定义的位置在另一个类的内部或外部,会影响结构相等性比较。例如,以下代码段
中的断言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
定义位置如何,都满足。
也许是某种程度上受传递到extract
的隐式Manifest
的影响吗?
答案 0 :(得分:4)
这是一个错误。
https://github.com/json4s/json4s/issues/564 “反序列化的内部案例类无法与代码中初始化的案例类进行比较”
答案 1 :(得分:2)
由于每个实例都拥有对外部对象的引用,因此无法有效地检查类似内部类的类是否相等。这些引用是等同性检查的一部分:
class Outer {
case class Inner(s: String)
}
val outer = new Outer()
val a = outer.Inner("x")
val b = outer.Inner("x")
println(a==b) //true
val c = new Outer().Inner("x")
println(a==c) //false