【问题标题】:create object expressions with by content equality behavior通过内容相等行为创建对象表达式
【发布时间】:2018-07-26 11:15:16
【问题描述】:

我想使用对象表达式创建动态对象,但我想通过它们的内容来比较它们。有没有不实现equalshashCode的简单写法?

为了更具体,使这个测试的断言通过的最小更改是什么?

@Test
fun `an object comparison test`() {
    val obj1 = object {
        val x = 1
    }
    val obj2 = object {
        val x = 1
    }

    assertEquals<Any>(obj1, obj2)
}

【问题讨论】:

  • 不,没有办法。这两个对象是两个不同类的实例,彼此之间没有关系。每当编译器或 IDE 为您生成 equals() 时,它要求对象具有相同的类。
  • 谢谢@yole。这是有道理的。

标签: kotlin equality


【解决方案1】:

如果不实现相应的equals(至少),它们将永远不会相等。这就是您创建的每个objectinstance 的本质。例外情况是 data class 实例实际上已经为您提供了适当的 equals()/hashCode()

所以

data class Some(val value : String)

println(Some("one") == Some("one"))

实际上会打印true,即使这是两个不同的实例。

最简单的方法可能是提供您自己的断言函数(可能是通过反射或不通过反射),或者如果您的测试框架提供反射断言等于方法。 在后一种情况下,您可能会对以下内容感兴趣:How do I assert equality on two classes without an equals method?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多