据我所知,诸如SortedMap
or之类的东西在类型上SortedSet
使用compareTo
(而不是equals
)Comparable<?>
来检查相等性(contains
, containsKey
)。
但是,如果某些类型在概念上是相等的,但不可比较怎么办?
(哈希码、内存地址……)
我必须声明一个Comparator<?>
并覆盖方法int compareTo(T o1, To2)
。好的,对于被认为相等的实例,我可以返回 0。但是,对于特殊情况,如果订单不明显,我应该返回什么?
在equatable但(从概念上)不可比较的类型上使用 SortedMap 或 SortedSet 的方法是否很好?
谢谢!
编辑:
我不想存储排序的东西,但我会使用“通常”的 Map 和 Set,我不能“覆盖”平等行为。
编辑 2:
为什么我不能直接覆盖equals(...)
:
我需要改变一个外部类的平等行为。我无法编辑它。
编辑 3:
想想 .NET:他们有 IEquatable 接口,它可以改变相等行为而不触及可比较的行为。
编辑4:
我不能只compareTo
为相等的实例返回0,为不相等的实例返回1吗?有什么大问题?我已经完成了一些测试,似乎 SortedMap/SortedSet 在一对实例上调用了 compareTo 一次。是的,订单没有意义,但为什么会是我的问题呢?我不需要订单。*我只需要改变平等行为。可悲的是,大多数人无法理解这一点。
注意:现在证明不相等实例返回 1 的概念是错误的。
编辑5:改变外国班级
的
平等行为是一个坏概念?当然?我不这么认为:为什么我可以使用 改变外国班级的比较行为?Comparator
编辑 6:
感谢Mark Peters
并感谢waxwing
将密钥类型包装在自定义类中的想法。这样,我可以覆盖 equals 和 hashCode,从而改变相等行为。