gpt4 book ai didi

kotlin - 在 Kotlin 中覆盖等于

转载 作者:行者123 更新时间:2023-12-04 15:06:22 25 4
gpt4 key购买 nike

CS实现 kotlin.CharSequence .它的精髓在这里:

class CS  (val sequence: CharSequence = "") : CharSequence {
... override get/length in interface CharSequence
override fun equals(other: Any?): Boolean =
(this === other) || ((other is String) && this.sequence.equals(other))
}

编译器反对 CS("hello") == "hello" as:运算符'=='不能应用于'CS'和'String'。 CS("hello") == "hello" as Any 没有问题或 CS("hello").equals("hello")两者都有效。

我究竟做错了什么?

最佳答案

我不确定这个错误的原因,但它可能与你的方法的更深层次的问题有关......

在 Kotlin(和 Java)中,equals()方法具有相当严格的规范。一个条件是它必须是对称的:只要 ab不为空,a.equals(b)必须始终给出与 b.equals(a) 相同的结果.

但是你的实现没有通过这个测试,因为 CS("abc").equals("abc")返回 true , 而 "abc".equals(CS("ABC"))false .那是因为你的类(class)知道 CharSequenceString , 但是 String不知道你的课。

没有简单的方法解决这个问题。通常,允许类的实例仅等于该类的实例要安全得多。如果你控制这两个类,那么有一些方法可以解决这个问题,但它们非常微妙和复杂。 (也许最好的解释是 Martin Odersky et al 。)

所以 equals() 的大多数实现倾向于沿着这些方向工作:

override fun equals(other: Any?)
= (other is ThisClass)
&& field1 == other.field1
&& field2 == other.field2
// ...

正如我所说,我不知道为什么 Kotlin 编译器会提示你的情况。可能是它发现了这个问题,也可能是无关的东西。但我不认为你将能够以相等检查将做你想要的方式来修复你的程序,所以也许最好将此作为尝试稍微不同的方法的提示!

关于kotlin - 在 Kotlin 中覆盖等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52815103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com