Arhn - архитектура программирования

Как исправить ошибку, найденную с помощью поиска ошибок

Ниже приведен код, который я должен выполнить для безопасного анализа, найти ошибки, обнаруженные в этом методе.

 // Equals Method
    public boolean equals(Date dateIn){
       if(day == dateIn.day && month == dateIn.month && year == dateIn.year)
           return true;
        else
           return false;
    }

Find Bugs говорит: Этот класс определяет ковариантную версию метода equals(), но наследует обычный метод equals(Object), определенный в базовом классе java.lang.Object. Класс, вероятно, должен определить логический метод equals(Object).

Как избавиться от этого бага, может кто поможет?

19.04.2015

  • Ваш метод equals недействителен. Должно быть boolean equals(Object o). 19.04.2015
  • @BoristheSpider О, это правильный метод, он просто не переопределяет метод в Object. 19.04.2015
  • @immibis, если ты педантичен, то да. Но это недопустимый метод equals, поскольку он (по крайней мере, на мой взгляд) всегда относится к методу на Object. 19.04.2015

Ответы:


1

equals() должен принимать Object в качестве аргумента, чтобы соответствовать суперметоду, который он переопределяет. Используйте аннотацию @Override, чтобы применить это.

// Equals Method
@Override
public boolean equals(Object o){
    if (!(o instanceof Date))
        return false;
    Date dateIn = (Date) o;
    if(day == dateIn.day && month == dateIn.month && year == dateIn.year)
        return true;
    else
        return false;
}
19.04.2015

2

Вы перегружаете метод equals(). Это означает, что есть две фактические функции, которые можно вызвать. А именно унаследованный equals(Object) и ваш equals(Date).

Перегрузка означает наличие нескольких методов с одним и тем же именем, но разными типами аргументов.

Переопределение означает, что вы изменяете реализацию метода, определенного в суперклассе (классе, от которого вы наследуете). Если вы не наследуете напрямую от другого класса, вы наследуете функции от Object по умолчанию (например, как equals(Object) в данном случае).

@Override аннотация обеспечивает проверки и ошибки во время компиляции, если нет такого метода для перезаписи. Это произошло бы в вашем случае (поскольку вы перегружали, а не переопределяли).

Измените свой код на

// Equals Method
@Override
public boolean equals(Object object) {
   if(this == object) return true;
   if(!(object instanceof Date)) return false;

   Date dateIn = (Date) object;      
   if(day == dateIn.day && month == dateIn.month && year == dateIn.year)
       return true;
   else
       return false;
}
19.04.2015
  • Я отредактировал ваш ответ, обратите внимание, что перегрузка != переопределение. 19.04.2015
  • Ну, вообще-то он перегрузил функцию, когда ввел equals(Date). 19.04.2015
  • Будет здорово, если вы сможете объяснить разницу между ними, похоже, это поможет ОП понять свою ошибку. 19.04.2015
  • Я попробовал весь приведенный выше код в своем классе, но поиск ошибок по-прежнему находит ту же ошибку 19.04.2015
  • Он все еще находит проблему? Вы удалили свою собственную функцию equals(Date)? 19.04.2015

  • 3

    Если этот класс Date является написанным вами пользовательским классом Date, вы должны изменить свой метод equals, чтобы переопределить метод Object equal :

    @Override
    public boolean equals(Object other)
    {
       if (this == other)
           return true;
       if (!(other instanceof Date))
           return false;
       Date dateIn = (Date) other;
       if(day == dateIn.day && month == dateIn.month && year == dateIn.year)
           return true;
        else
           return false;
    }
    

    В противном случае он не будет использоваться должным образом (поскольку коллекции, такие как HashMap, HashSet, ArrayList и т. д., будут вызывать реализацию по умолчанию Object equals вместо вызова вашей реализации).

    19.04.2015
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..