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