Кажется, это нарушает запрет на то, чтобы Comparator был совместим с equals() - т. Е. Две коллекции могут быть неравными (имея разные элементы), но сравниваться с одним и тем же значением (потому что они имеют одинаковое количество элементов).
Нет требований, заявленных (в Javadoc) или подразумеваемых, чтобы Comparator
соответствовал реализации объекта boolean equals(Object)
.
Обратите внимание, что Comparable
и Comparator
— это разные интерфейсы с разными целями. Comparable
используется для определения «естественного» порядка для класса. В этом контексте было бы плохой идеей, если бы equals
и compateTo
были несовместимы. Напротив, Comparator
используется, когда вы хотите использовать порядок, отличный от естественного порядка класса.
РЕДАКТИРОВАТЬ: Вот полный абзац из Javadoc для SortedSet.
Обратите внимание, что порядок, поддерживаемый отсортированным набором (независимо от того, предоставлен явный компаратор или нет), должен соответствовать равенству, если отсортированный набор должен правильно реализовать интерфейс Set. (См. интерфейс Comparable или интерфейс Comparator для точного определения соответствия с равными.) Это так, потому что интерфейс Set определен в терминах операции равенства, но отсортированный набор выполняет все сравнения элементов, используя свой метод compareTo (или сравнение). , так что два элемента, которые считаются равными с помощью этого метода, равны с точки зрения отсортированного множества. Поведение отсортированного набора четко определено, даже если его порядок несовместим с равными; он просто не подчиняется общему контракту интерфейса Set.
Я выделил последнюю фразу. Дело в том, что такой SortedSet будет работать так, как вы, скорее всего, ожидаете, но поведение некоторых операций не будет точно соответствовать спецификации Set
... потому что спецификация определяет их поведение в терминах метода equals
.
Так что на самом деле существует существует заявленное требование согласованности (моя ошибка), но последствия его игнорирования не так ужасны, как вы могли бы подумать. Конечно, вам решать, стоит ли вам это делать. По моей оценке, все должно быть в порядке, если вы тщательно прокомментируете код и убедитесь, что SortedSet не «утекает».
Однако мне не ясно, будет ли компаратор для коллекций, который смотрит только на «размер» коллекций, работать ... с семантической точки зрения. Я имею в виду, вы действительно хотите сказать, что все коллекции с (скажем) 2 элементами равны? Это будет означать, что ваш набор может содержать только одну коллекцию любого заданного размера...
person
Stephen C
schedule
03.10.2009