interface Animal
не должен реализовывать Comparable<Animal>
во-первых, если вы не хотите, чтобы его подклассы были взаимно сопоставимыми.
Есть релевантная цитата из Effective Java 2nd Ed, в пункте 8 «Рассмотрите возможность реализации сопоставимого» (я скопировал большую часть следующего из моего ответа на этот вопрос ):
Одно из следствий этих трех положений [compareTo
контракт] заключается в том, что тест на равенство, налагаемый методом сравнения, должен подчиняться тем же ограничениям, налагаемым контрактом на равенство: рефлексивность, симметрия и транзитивность.Следовательно, применяется то же самое предостережение: нет никакого способа расширить инстанцируемый класс новым компонентом значения при сохранении контракта CompareTo, если вы не хотите отказаться от преимуществ объектно-ориентированной абстракции (элемент 8).
Итак, это означает, что при условии, что ваш подкласс не имеет больше значений, чем суперкласс, используемый для определения порядка , реализация Comparable<Supertype>
является разумной.
Смыслэто, в дополнение к общим требованиям Comparable
, заключается в том, что Comparable<Superclass>
должны быть реализованы одинаково в Superclass
и во всех подклассах.