Я относительно новичок в Java и пытаюсь решить некоторые основные вопросы. Один из моих друзей попросил меня объяснить, что может пойти не так с этим фрагментом кода. Для меня это выглядит отлично. Я даже попробовал, и это работает.
Можете ли вы, ребята, помочь мне с этим?
public int compareTo(Object o){
Employee emp = (Employee) o;
return this.id - o.id;
}
Я не мог найти никаких хороших объяснений. Также id является целым числом.
Comparable
- это интерфейс с общим, поэтому он должен быть Comparable<Employee>
. (Таким образом, вы уверены, что сравниваете Employee с сотрудником, а не с сотрудником с номером.)
Employee emp = (Employee) emp;
Имеют смысл?
Вы наложили emp
на Employee
и поместили его в emp
. Может быть, вы имеете в виду (Employee) o
return this.id - o.id;
Вы используете o
который является Object
, а Object
не имеет .id
Возможно, вы имеете в виду emp.id
?
Если вы уверены, что id
уникален, и нет целочисленного переполнения (для чего потребуется отрицательный id
s), этот код должен работать должным образом. С другой стороны, если два Emp
(считаются разными) могут иметь один и тот же id
(потому что это не идентификатор, который мы ожидаем от его имени), то это может привести к ситуации, когда две Emp
считаются равными, когда на самом деле они не.
Вы не используете экземпляр emp, чтобы что-либо сделать... Если вы пытаетесь сравнить Employee
(this
) с Object o
который всегда является Employee
, то вы хотите return this.id - emp.id;
class Employee implements Comparable<Employee> {
public int compareTo(Object o) {
if (o instanceof Employee) {
Employee emp = (Employee) o;
return this.id - emp.id;
}else {
throw new IllegalArgumentException("Parameter not of type Employee!");
}
return null;
}
}
Я думаю, что все в порядке. Какая проблема, если id отрицательный?
public int compareTo(Employee o){
return this.id - o.id;
}
Если вы действительно приверженец:
public int compareTo(Object o){
long thisId = this.id;
long oId = o.id;
long result = thisId - oId;
if (result > Integer.MAX_VALUE) result = Integer.MAX_VALUE;
if (result < Integer.MIN_VALUE) result = Integer.MIN_VALUE;
return result;
}
Это становится сложно, если вы не можете гарантировать, что идентификатор положительный или отрицательный. сложная часть, если id становится отрицательным, чем вычитание может переполняться и вызывать неверный результат
int
, а не unsigned int
. Он будет переполнен при очень отрицательном числе, так же как переполнен при очень положительном числе. Возможно, здесь нет особого беспокойства.
compareTo() также является зарезервированной функцией usesd при сравнении строк. Поэтому, возможно, он хочет, чтобы вы заметили, что методы с тем же именем могут вызывать проблемы.
Comparable
реализует класс, так что ваш ответ в лучшем случае вводит в заблуждение.
compareTo()
относится только к String
? Я предлагаю вам прочитать статью учебника Java: «Упорядочение объектов» !
instanceof
.