Kotlin 比较CharSequence.reversed()返回值时出现意外结果

Kotlin 比较CharSequence.reversed()返回值时出现意外结果,kotlin,Kotlin,在比较CharSequence.reversed()方法的结果时,我注意到一个奇怪的行为 结果: a == a: false 而且subSequence.reversed()==subSequence.reversed()也是false 有人能解释这种意外的行为吗?请注意,您可能对所显示的内容和行为方式感到困惑 您看到的是toString()的输出。任何类型都可以通过重写该方法来决定其对象的字符串表示形式。但是,这不会影响该类型对象之间的比较方式。这就是等于(在某些情况下还包括比较)的原因 其

在比较CharSequence.reversed()方法的结果时,我注意到一个奇怪的行为

结果:

a == a: false
而且
subSequence.reversed()==subSequence.reversed()
也是
false


有人能解释这种意外的行为吗?

请注意,您可能对所显示的内容和行为方式感到困惑

您看到的是
toString()
的输出。任何类型都可以通过重写该方法来决定其对象的字符串表示形式。但是,这不会影响该类型对象之间的比较方式。这就是
等于
(在某些情况下还包括
比较
)的原因

其他人写了一些关于要比较的对象的底层类型不相等的东西(一边是
StringBuilder
,另一边是
String
)。然而,实际的问题是
等于
-方法。可能是(由于各种原因,通常不这样做),某一类型的
equals
支持不同类型对象的相等性(至少应该在接口中提到这种行为)。如果未指定任何内容,则可以假定默认的相等值为

然而,在这种情况下,政府已经声明了以下关于平等的内容(重点是我的):

此接口不会细化
equals
hashCode
方法的一般契约因此,测试实现CharSequence的两个对象是否相等的结果通常是未定义的。每个对象可能由不同的类实现,并且不能保证每个类都能够测试其实例是否与其他类的实例相等。因此,将任意CharSequence实例用作集合中的元素或映射中的键是不合适的


因此总结:忘记您从
子序列
反向
中得到了
字符串
StringBuilder
。方法契约指定了
CharSequence
,因此您必须将其作为
CharSequence
处理。无法保证这些函数将来仍将返回
字符串
StringBuilder

请注意,您可能会对所显示的内容和行为感到困惑

您看到的是
toString()
的输出。任何类型都可以通过重写该方法来决定其对象的字符串表示形式。但是,这不会影响该类型对象之间的比较方式。这就是
等于
(在某些情况下还包括
比较
)的原因

其他人写了一些关于要比较的对象的底层类型不相等的东西(一边是
StringBuilder
,另一边是
String
)。然而,实际的问题是
等于
-方法。可能是(由于各种原因,通常不这样做),某一类型的
equals
支持不同类型对象的相等性(至少应该在接口中提到这种行为)。如果未指定任何内容,则可以假定默认的相等值为

然而,在这种情况下,政府已经声明了以下关于平等的内容(重点是我的):

此接口不会细化
equals
hashCode
方法的一般契约因此,测试实现CharSequence的两个对象是否相等的结果通常是未定义的。每个对象可能由不同的类实现,并且不能保证每个类都能够测试其实例是否与其他类的实例相等。因此,将任意CharSequence实例用作集合中的元素或映射中的键是不合适的


因此总结:忘记您从
子序列
反向
中得到了
字符串
StringBuilder
。方法契约指定了
CharSequence
,因此您必须将其作为
CharSequence
处理。不能保证这些函数将来仍然返回
String
StringBuilder

CharSequence
实际上是类
String
StringBuilder
实现的接口。
subSequence(0,1)
的结果不等于
subSequence.reversed()
的原因是它们返回的实际类型

子序列(0,1)
调用返回一个
字符串
,而
reversed()
返回一个
StringBuilder
。因此,equals方法将返回
false
,因为类型不同

如果对
reversed()
的结果调用
toString()
,它将像您预期的那样工作:


CharSequence
实际上是类
String
StringBuilder
实现的接口。
subSequence(0,1)
的结果不等于
subSequence.reversed()
的原因是它们返回的实际类型

子序列(0,1)
调用返回一个
字符串
,而
reversed()
返回一个
StringBuilder
。因此,equals方法将返回
false
,因为类型不同

如果对
reversed()
的结果调用
toString()
,它将像您预期的那样工作:


转换回
字符串
可修复此问题,因为此时将应用正确的(预期的)
equals

val s = "a"
val subSequence = s.subSequence(0, 1)
println(subSequence.reversed() == subSequence.reversed()) //false
println(subSequence.reversed().toString() == subSequence.reversed().toString()) //true

转换回
字符串
可修复此问题,因为此时将应用正确的(预期的)
equals

val s = "a"
val subSequence = s.subSequence(0, 1)
println(subSequence.reversed() == subSequence.reversed()) //false
println(subSequence.reversed().toString() == subSequence.reversed().toString()) //true
String.subSequence CharSequence和CharSequence.reversed()CharSequence。别以为是关于t的
val s = "a"
val subSequence = s.subSequence(0, 1)
println(subSequence.reversed() == subSequence.reversed()) //false
println(subSequence.reversed().toString() == subSequence.reversed().toString()) //true