Как я могу переключаться между классами? - PullRequest
0 голосов
/ 09 апреля 2020

Это то, что я написал.

public class Test {
    public static void main(String[] args) {
        Object a1 = new A();
        Object a2 = new Object();

        System.out.println(a1.toString());

        System.out.println((a1 == a2) + " " + (a1.equals(a2)));
    }
}

class A {
    int x;

    public boolean equals(Object obj) {
        A _obj = (A) obj;
        return x == _obj.x;
    }

    public String toString() {
        return "A's x is " + x;
    }
}

Как я могу сделать 'false true' на консоли? За исключением пересмотра основного метода. Пересмотреть только метод. Я пытался изменить объект a2 на a2. Как я могу изменить это в классе А?

Ответы [ 2 ]

3 голосов
/ 09 апреля 2020

Причина, по которой вы получаете ошибку class java.lang.Object cannot be cast to class A, заключается в том, что объект, с которым вы сравниваете ее, не является экземпляром класса A, поэтому попытка привести объект как таковой завершится неудачей.

Когда Реализуя метод .equals, вы должны всегда выполнять эти три проверки в первую очередь, чтобы обеспечить безопасность объекта, прежде чем пытаться сравнивать его свойства:

if (obj == this) return true; Если два объекта являются абсолютно одинаковыми объектами, это означает, что это один и тот же экземпляр, а не просто два объекта с одинаковыми свойствами, которые сразу же возвращают true, потому что нет необходимости проверять свойства.

if (obj == null) return false; Это предотвращает NullPointerException, пытаясь получить доступ к свойству объект null (например, когда в вашем коде вы делаете return x == _obj.x)

if (!(obj instanceof A)) return false; Если объект не является экземпляром вашего класса, произойдет сбой приведения типа (как это было в вашем коде) и это защищает от этого, возвращая false перед попыткой сотворения.

Наконец, если код достигает этой точки, вы можете разыграть и сравнить объекты так, как вы это делали. один в вашем коде:

A _obj = (A) obj;
return this.x == _obj.x;

Имейте в виду, что если сравниваемые свойства не являются примитивами, вы должны использовать .equals для них

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

Прежде всего, что вы имеете в виду, когда именно «делаете ложь истинной»? Я предполагаю, что вы хотите, чтобы ваш код выполнялся, но не могли бы вы дать нам немного больше информации о том, что вы пытаетесь сделать?

Причина, по которой ваш код дает сбой, заключается в том, что вы пытаетесь привести свой экземпляр объекта ( a2 ) на ссылку типа A при передаче его в метод equals. Но поскольку a2 на самом деле является чистым экземпляром Object , а не A , это приведение завершится неудачно. Даже если Object является базовым классом для всего в Java, включая ваше самоопределение A , вы используете неверное направление. Объект не имеет атрибута x , поэтому приведение таким образом будет небезопасным. Механизм проверки типов Java ловит это и выдает ошибку, когда вы пытаетесь привести.

Посмотрите документ, объясняющий наследование и приведение, чтобы получить основы этого. Например, этот .

...