Почему мы приводим тип объекта к типу класса в Java? - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь переписать метод equals.Наш профессор по какой-то причине приводит объектный параметр к классу типов (счетчик).

Может ли кто-нибудь объяснить мне логику этого?Если я вместо "Couter, что = (Counter) другой;"просто удалите эту строку и замените «that.count» на «other.count», он выполняется просто отлично.

public class Counter {

private int count;

public Counter() {
    count = 2;
}

public boolean equals(Counter other) {
    if(other instanceof Counter) {
        Counter that = (Counter) other;
        return (this.count == that.count);
    }
    else {
        return false;
    }
}

public static void main(String args []) {
    Counter casio = new Counter();
    Counter texas = new Counter();
    System.out.println(casio.equals(texas));
 }

}

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Нет логики ... кроме того факта, что в сигнатуре методов equals, вероятно, есть ошибка.Здесь equals - перегрузка методов equals, унаследованных от класса Object.

правильный способ определить метод equals - это переопределить унаследованный от метода equals объект формы.

public boolean equals(Object other) {
      if(other instanceof Counter) {
        Counter that = (Counter) other;
        return (this.count == that.count);
      }
      else {
          return false;
      }
}

в этом случае приведение является обязательным

0 голосов
/ 01 марта 2019

Причина того, что приведение необходимо, состоит в том, что разработчик метода equals хочет использовать поле класса Counter, то есть поле count.

, поскольку параметрother передано методу типа Object.Поэтому компилятор не знает, что это на самом деле объект Counter.С помощью typecast вы сообщаете компилятору, что вы уверены, что объект на самом деле является Counter экземпляром.

Затем компилятор позволяет вам использовать его определенные члены, такие как count.

Всегда ли приведение типов является безопасным?

Обратите внимание, что приведение может обычно генерировать ClassCastException во время выполнения, но поскольку сначала тип объекта проверяется оператором instanceof, этогарантируется, что объект на самом деле является Counter экземпляром, поэтому это безопасно делать.

Почему необходимо явное приведение?

Почему необходимо явное приведение типов, когда мы уже проверяем тип с помощьюinstanceof?Причина, по которой это явное приведение необходимо, заключается в том, что instanceof - это проверка времени выполнения .Приведение - это утверждение во время компиляции.


Но почему бы не просто boolean equals(Counter other)?

Это потому, что тогда вы перегружаете метод Object равным, а не переопределяете.

0 голосов
/ 01 марта 2019

Подпись вашего метода equals неверна.Чтобы переопределить этот метод, он должен иметь параметр типа Object:

@Override
public boolean equals(Object other) {

И для этого необходимо привести other к Counter и выполнить проверку instanceof, в противном случаеВы не можете получить доступ к полю count.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...