вызов метода child из экземпляра типа Parent - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно создать следующий метод equals:

public boolean equals(ParentClass pa) {
    if (!(pa instanceof ChildClass))
        return false;
    boolean sameID = ID.equals(pa.getID());
    return super.equals(pa) && sameID;
}

Класс ChildClass является дочерним по отношению к классу ParentClass, и это будет метод equals.Метод getId () есть только в ChildClass, но мне нужно знать, как заставить метод pa.getID () работать, есть ли способ выполнить приведение здесь?так как я получаю сообщение об ошибке, компилятор не может быть уверен, является ли pa экземпляром Child или нет.

Это ошибка, которую я получаю:

Error:(19, 73) java: cannot find symbol
  symbol:   method getID()
  location: variable pa of type ParentClass

Мне нужен метод типа ParentClass, потому что функция должна возвращать false, когда объект типа ParentClass вместо ошибки.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Существует общая схема, которой полезно следовать при переопределении equals.Я предоставлю версию с исправлениями здесь и обрисую, какие были эти исправления ниже:

@Override
public boolean equals(Object o) {
    if (this == o) { return true; }
    if (!super.equals(o) 
        || o == null 
        || getClass() != o.getClass()) { 
            return false; 
    }
    ChildClass other = (ChildClass) o;
    return this.getID().equals(other.getID());
}

Во-первых, материал, который вы обычно можете копировать-вставлять между реализациями equals:

  • Всегда @Override метод equals - это поможет выявить проблемы, при которых вы случайно его перегружаете (одно и то же имя метода, разные типы аргументов).Перегрузка equals является плохой практикой, которая вызывает проблемы.

  • Начните с проверки == - если это пройдет, нет необходимости тратить циклы ЦП, выполняя больше логики.Хотя на самом деле это всего лишь небольшая оптимизация, это полезная рекомендация.

  • Если вы расширяете класс, отличный от Object, проверьте равенство super.

  • Убедитесь, что классы одинаковы .Обратите внимание, что это , а не и instanceof проверка.

    • Помните, что equals должно быть симметричным: для любых ненулевых опорных значений x и y x.equals (y) должно возвращать true тогда и только тогда, когда y.equals (x) возвращает true.
    • Если вы используете instanceof, вы, скорее всего, столкнетесь с случаем, когда parent.equals(child) == true, но child.equals(parent) == false - это плохо.
    • В некоторых случаях instanceof - это нормально, нопроверка равенства классов более безопасна и правильна большую часть времени.

Теперь специфические для класса вещи:

  • Приведите параметр Objectс типом вашего класса, и сравните те, которые вам небезразличны для равенства.
    • Обратите внимание, что вызовы на this должны совпадать с вызовами на other - в вашем случае я изменил оба метода на вызов getID().Кроме того, оба могут ссылаться на закрытого члена ID - но они должны быть согласованы.

Наконец, не забывайте, что equals и hashCode являются парой - вы всегда должны реализовывать их вместе .(Я знаю, что вы специально не спрашивали об этом, но я указываю на это, поскольку это распространенная ошибка, которую люди допускают при реализации equals)

  • Если два объекта равны в соответствии с равными(Object), затем вызов метода hashCode для каждого из двух объектов должен давать одинаковый целочисленный результат.Если вы переопределяете только equals (), а не hashCode (), ваш класс нарушает этот контракт.

Надеюсь, это поможет вам и всем остальным с проблемами при реализации equals.

0 голосов
/ 04 декабря 2018

После того, как вы проверите тип объекта и убедитесь, что его экземпляр ChildClass просто преобразуйте его в тип ChildClass и используйте его:

public boolean equals(ParentClass pa) {
if (!(pa instanceof ChildClass))
    return false;
ChildClass child = (ChildClass) pa;
boolean sameID = ID.equals(child.getID());
return super.equals(child) && sameID;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...