Java сравнить с основами метода

1

Я относительно новичок в Java и пытаюсь решить некоторые основные вопросы. Один из моих друзей попросил меня объяснить, что может пойти не так с этим фрагментом кода. Для меня это выглядит отлично. Я даже попробовал, и это работает.

Можете ли вы, ребята, помочь мне с этим?

public int compareTo(Object o){
   Employee emp = (Employee) o;
   return this.id - o.id;
}

Я не мог найти никаких хороших объяснений. Также id является целым числом.

  • 0
    Целочисленное занижение?
  • 7
    Я не вижу ничего, что могло бы пойти не так, кроме случаев, когда Объект, переданный в качестве аргумента, не относится к типу Employee или подклассу Employee. Вы можете проверить это с помощью оператора instanceof .
Показать ещё 9 комментариев
Теги:

7 ответов

3

Comparable - это интерфейс с общим, поэтому он должен быть Comparable<Employee>. (Таким образом, вы уверены, что сравниваете Employee с сотрудником, а не с сотрудником с номером.)

Employee emp = (Employee) emp;

Имеют смысл?

Вы наложили emp на Employee и поместили его в emp. Может быть, вы имеете в виду (Employee) o

return this.id - o.id;

Вы используете o который является Object, а Object не имеет .id Возможно, вы имеете в виду emp.id?

  • 0
    Сделано это изменение, и можно с уверенностью предположить, что переданный объект всегда будет экземпляром Employee.
  • 1
    Нет, это не безопасно. Вы не знаете, что вы передадите ему.
Показать ещё 4 комментария
1

Если вы уверены, что id уникален, и нет целочисленного переполнения (для чего потребуется отрицательный id s), этот код должен работать должным образом. С другой стороны, если два Emp (считаются разными) могут иметь один и тот же id (потому что это не идентификатор, который мы ожидаем от его имени), то это может привести к ситуации, когда две Emp считаются равными, когда на самом деле они не.

1

Вы не используете экземпляр emp, чтобы что-либо сделать... Если вы пытаетесь сравнить Employee (this) с Object o который всегда является Employee, то вы хотите return this.id - emp.id;

0
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 отрицательный?

0
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;
}
0

Это становится сложно, если вы не можете гарантировать, что идентификатор положительный или отрицательный. сложная часть, если id становится отрицательным, чем вычитание может переполняться и вызывать неверный результат

  • 0
    Это не переполнится, если это просто отрицательно. Это int , а не unsigned int . Он будет переполнен при очень отрицательном числе, так же как переполнен при очень положительном числе. Возможно, здесь нет особого беспокойства.
  • 1
    В этом и заключается хитрость, если приведенное число очень отрицательно, это приведет к переполнению. Поскольку мы вычитаем, очень положительное число действительно не повлияет.
Показать ещё 1 комментарий
-2

compareTo() также является зарезервированной функцией usesd при сравнении строк. Поэтому, возможно, он хочет, чтобы вы заметили, что методы с тем же именем могут вызывать проблемы.

  • 2
    CompareTo () представляет собой метод каждый Comparable реализует класс, так что ваш ответ в лучшем случае вводит в заблуждение.
  • 0
    Я правильно понимаю? Вы говорите, что compareTo() относится только к String ? Я предлагаю вам прочитать статью учебника Java: «Упорядочение объектов» !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню