Потерял ли объект значение своих атрибутов после Upcasting, а затем Downcasting? - PullRequest
0 голосов
/ 23 сентября 2019

Я перенес экземпляр Model2 в следующем коде в класс Object, а затем обратно обратно в класс - Model2 в тестовом методе класса Model1.Но затем значение его атрибута после даункастинга становится нулевым.Ожидается ли это, что экземпляр потеряет свое состояние после Upcasting-затем-Downcasting?Не могли бы вы поделиться некоторыми деталями для того же.Кроме того, есть ли способ сохранить состояние экземпляра после обновления?

public class Demo{

    public static void main(String[] args) {
        Model1 m1 = new Model1();
        m1.setAttr1(10);

        Model2 m2 = new Model2();
        m2.setAttr2(10);

        m1.test(m2);
    }

}


class Model1 {

    private Integer attr1;

    public Integer getAttr1() {
        return attr1;
    }

    public void setAttr1(Integer attr1) {
        this.attr1 = attr1;
    }

    public void test(Object o) {
        Model2 m = (Model2) o;
        System.out.println(m.getAttr2());
    }

}

class Model2 {

    private Integer attr2;

    public Integer getAttr2() {
        return attr2;
    }

    public void setAttr2(Integer attr1) {
        this.attr2 = attr2;
    }
}

Ответы [ 2 ]

6 голосов
/ 23 сентября 2019

Нет, вы не потеряете данные при сотворении - Объект - это Объект, которым он является.

Вы получаете null из-за опечатки в Model2

public void setAttr2(Integer attr1) {
        this.attr2 = attr2;
}

Выустанавливают attr2 для себя, определение функции должно быть (Interger attr2)

Изменение, которое будет выводить 10

1 голос
/ 23 сентября 2019

Приведение не теряет никакой информации в Java, оно просто меняет уровень абстракции (т. Е. Вы не можете получить доступ к методу getAttr2 () для 'o', пока он все еще приводится как объект)

Настоящая проблема - опечатка в модели2.Вы устанавливаете переменную attr2 для себя, которая имеет значение null, чтобы начинаться с

Вы хотите, чтобы она была this.attr2 = attr1


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

public void test(Object o) {
    if (o == null) {
        System.out.println("Don't give me a null");
    } else if (o instanceof Model2) {
        Model2 m = (Model2) o;
        System.out.println(m.getAttr2());
    } else {
        System.out.println("Wrong type. Was given " + o.getClass());
    }
}

В реальномкласс, в котором вы могли бы сделать что-то полезное в этих разделах, например, выбросить исключение

...