Я полагаю, что ответ на вопрос о том, почему вы в конечном итоге вызываете метод compareTo(Object)
вместо конкретного, заключается в том, что в вашем определении класса указано implements Comparable
(без какого-либо параметра типа).Без какого-либо универсального типа любые типы, такие как T
, по умолчанию будут Object
.
. Есть несколько решений для этого.Первый уже был рекомендован другими, и он включает в себя создание собственных пользовательских Comparator<Blabla>
объектов и использование их в ваших методах сортировки.Поскольку эти компараторы являются отдельными объектами, они не будут мешать существующему поведению класса.Возьмите эти компараторы, например, для некоторого класса Person
, который имеет методы getName()
и getAge()
.Вы можете создать столько их, сколько вам нужно.
public class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
public class NameComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}
После того, как вы все заработаете, вы можете решить, хотите ли вы изменить свой исходный класс, чтобы он правильно реализовывал Comparable<Blabla>
.В этот момент вы полностью удаляете метод compareTo(Object)
и оставляете другой.Когда вы компилируете или сохраняете в своей IDE, вы обнаруживаете все места, на которые этот объект ссылается как Comparable
без типа, и они будут отображаться как предупреждения или ошибки компилятора.Затем вам решать, как исправить код в каждом случае.Это очень сильно зависит от того, что метод compareTo(Object)
делает иначе, чем метод compareTo(Blabla)
.Если он явно выполняет instanceof
проверку и / или приведение непосредственно к типу Blabla
, то преобразование должно быть на 100% безопасным, поскольку это означает, что весь существующий код должен использовать его правильно, если вы никогда не испытываете ClassCastException
s во время выполнения.