Нет, вы не можете. Вы обнаружите, что код не компилируется - в аннотации @Override
говорится, что compareTo(Girl, int)
должен быть объявлен в суперклассе или интерфейсе, но это не так! Comparable<Girl>
определяет только compareTo(Girl)
.
Вместо этого вы должны использовать Comparator<Girl>
для каждого заказа. Это класс, который предоставляет свой собственный compareTo
, в котором принимают две девушки. Затем вы можете создавать разные компараторы и передавать соответствующую функцию, которая ему нужна. Другими словами, удалите поле order
с Girl
и вместо этого реализуйте различные порядки как разные экземпляры Comparator<Girl>
.
Большинство классов и функций, которые принимают T extends Comparable<T>
также есть версии, которые занимают T
и в Comparator<T>
. Одним из примеров этого является Collections.sort
. Другой - TreeSet
, который может принимать компаратор во время строительства.
Если это кажется раздражающим или педантичным, подумайте о том, как вы будете использовать такую функцию. Скажем, ваша функция занимает T extends Comparable<T>
. Вы пытаетесь сравнить два из них, позвонив по номеру item1.compareTo(item2)
, в соответствии с этим интерфейсом Comparable
. Если ваш код скомпилирован, этого метода не будет! Обратите внимание, что Java не имеет параметров по умолчанию, поэтому нет способа сказать «если они не пройдут в int order
, предположим, что это 0.»
В этом случае лучше, если вы используете компаратор – Deepak
Важный момент, чтобы помнить, что сравнение должно согласовать в обоих направлениях, так что вам придется использовать 'order' атрибут другого объекта тоже. – Bohemian