приветствую!не могли бы человеческим языком обьяснить почему при десериализации мы обязательно приводим нисходящее преобразование?
для чего оно нужно? ведь readObject возвращает Object а классы наследуются от обджект
class Employee{
Employee e = null;
try {
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Класс Employee не найден");
c.printStackTrace();
return;
}
System.out.println("Десериализованный Employee...");
System.out.println("Имя: " + e.name);
System.out.println("Адрес: " + e.address);
Taron Gukasyan
31 уровень
Десериализация (приведение)
Комментарии (1)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
gjkjntyxbr
26 августа 2021, 01:14
А ты попробуй приведение убрать, у тебя вылезет ошибка
Ты в переменную типа Employee, который является наследником класса Object, пытаешься засунуть ссылку на объект типа Object. А так нельзя. На экземпляр класса-наследника мы можем ссылаться из переменных родительского типа, но не наоборот.
Я могу быть не прав, пусть меня поправят. Но по логике:
Набор методов, которые мы можем вызвать, определяется типом переменной, а конкретная реализация каждого метода зависит уже от типа объекта. Если ты сделаешь так
такой код работать будет, т.к. класс Employee знает об этом методе и о всех методах, определенных в классе Object, ведь он его наследник. А если бы ты в классе Employee определил новый метод, допустим create(), и было бы разрешено писать так
у нас бы ничего не получилось, потому что класс Object ничего не знает о методе create(), в нем не определен способ его реализации. +1