Насколько я знаю, такие вещи, как SortedMap
или SortedSet
, используют compareTo
(а не equals
) на Comparable<?>
типах для проверки равенства (contains
, containsKey
).
Но что, если определенные типы сопоставимы по концепции, но не сопоставимы?
(хэш-коды, адреса памяти, ...)
Я должен объявить Comparator<?>
и переопределить метод int compareTo(T o1, To2)
. ОК, я могу вернуть 0 для экземпляров, которые считаются равными. Но, для необычных случаев, что я возвращаю, когда заказ не очевиден?
Является ли подход использования SortedMap или SortedSet на равным , но (по концепции) несопоставимых типов в любом случае хорош?
Спасибо!
EDIT:
Я не хочу хранить отсортированные вещи, но если бы я использовал «обычные» Map и Set, я бы не смог «переопределить» поведение равенства.
РЕДАКТИРОВАТЬ 2:
Почему я не могу просто переопределить equals(...)
:
Мне нужно изменить поведение равенства иностранного класса. Я не могу его редактировать.
РЕДАКТИРОВАТЬ 3:
Подумайте только о .NET: у них есть интерфейс IEquatable, который может изменять поведение равенства, не затрагивая сопоставимое поведение.
РЕДАКТИРОВАТЬ 4:
Разве я не могу просто заставить compareTo
вернуть 0 для равных и 1 для неравных экземпляров? В чем большая проблема? У меня есть несколько тестов, кажется, что SortedMap / SortedSet вызывают CompareTo для пары экземпляров один раз. Да, порядок не имеет смысла, но почему это должно быть моей проблемой? Мне не нужен заказ. * Мне просто нужно изменить поведение равенства. К сожалению, большинство людей просто не могут этого понять.
ПРИМЕЧАНИЕ: Концепция возврата 1 для неравных случаев теперь оказалась неверной.
РЕДАКТИРОВАТЬ 5:
Изменение поведения равенства иностранных классов - это плохая концепция? Конечно? Я так не думаю: почему тогда мне разрешено изменять поведение сравнения иностранных классов , используя Comparator
?
РЕДАКТИРОВАТЬ 6:
Спасибо Mark Peters
и waxwing
за идею обертывания типа ключа в пользовательский класс. Таким образом, я могу переопределить equals и hashCode, тем самым изменив поведение равенства.