Почему литье в равных необходимо? - PullRequest
1 голос
/ 25 апреля 2020

Я прохожу курс Moo c , и он учит нас, как сравнивать объекты из составных классов, таких как "Человек", и видеть, равны ли они друг другу. Они дают нам следующий код:

public class SimpleDate {
private int day;
private int month;
private int year;

public SimpleDate(int day, int month, int year) {
    this.day = day;
    this.month = month;
    this.year = year;
}

public int getDay() {
    return this.day;
}

public int getMonth() {
    return this.month;
}

public int getYear() {
    return this.year;
}

public boolean equals(Object compared) {
    // if the variables are located in the same position, they are equal
    if (this == compared) {
        return true;
    }

    // if the type of the compared object is not SimpleDate, the objects are not equal
    if (!(compared instanceof SimpleDate)) {
        return false;
    }

    // convert the Object type compared object
    // into an SimpleDate type object called comparedSimpleDate
    SimpleDate comparedSimpleDate = (SimpleDate) compared;

    // if the values of the object variables are the same, the objects are equal
    if (this.day == comparedSimpleDate.day &&
        this.month == comparedSimpleDate.month &&
        this.year == comparedSimpleDate.year) {
        return true;
    }

    // otherwise the objects are not equal
    return false;
}

@Override
public String toString() {
    return this.day + "." + this.month + "." + this.year;
}

}

Для метода равно, я получаю, что они сравнивают, используя сначала ==, чтобы проверить, находится ли это то же место. Затем они видят, является ли сравниваемый объект даже объектом того же типа, с которым вы сравниваете его, - если не вернуть false. После этого они преобразуют сравниваемый объект в тип объекта, с которым вы сравниваете, а затем сравниваете значения внутри. Мой вопрос заключается в том, какой смысл преобразовывать сравниваемый объект, если вы уже собираетесь возвращать false, когда они будут объектами разных типов? Разве

`SimpleDate comparedSimpleDate = (SimpleDate) compared;`

не кажется ненужным?

Ответы [ 2 ]

5 голосов
/ 25 апреля 2020

Строка необходима. В противном случае вы не сможете получить доступ к его данным и методам.


Java не позволяет вам делать compared.getYear() или compared.year, потому что все, что вы знаете о compared, это то, что это Object. Таким образом, это может быть Cat, у которого нет метода getYear(), компилятор не может знать.

Следовательно, вы должны привести, что означает "Эй, компилятор, поверь мне, я Знайте, что это на самом деле SimpleDate, поэтому, пожалуйста, позвольте мне относиться к нему как к одному ". Который, кстати, взломает sh во время выполнения, если на самом деле это не SimpleDate.


Конечно, вы проверяли, что это на самом деле SimpleDate раньше, но компилятор недостаточно умен, чтобы соединить точки. Все, что он знает, это то, что compared имеет тип Object.

0 голосов
/ 25 апреля 2020

В функции equals () проверяются действительные значения, а не адреса. Предположим, что переменная a содержит данные 121, а переменная b содержит данные 121.00, следовательно, a имеет тип integer, а b имеет тип float, поэтому при сопоставлении он возвращает false tleven, хотя значения одинаковы, поэтому нам нужно набрать

...