#java #casting #parent-child
#java #Кастинг #родитель-потомок
Вопрос:
Я столкнулся с вопросом реализации. Вопрос в том, возможно ли привести «дедушку» к «дочернему» в java.
Например:
Это родительский класс
public class IDDocument {
public IDDocument() {
}
}
Это класс, который наследуется от своего родителя, называется IdDocument
public class Passport extends IDDocument {
public Passport() {
}
}
И теперь есть этот класс, который наследуется от Passport
public class SLPassport extends Passport {
public SLPassport() {
}
}
Зная это, я хочу знать, возможно ли привести IdDocument к SLPassport.
Эта проблема возникла из-за того, что информация, которую я получаю от сервиса, содержится в типе IdDocument, но мне также нужны данные, которые содержатся только в SLPassport, и необходимо использовать IdDocument.
Ранее я мог привести Passport к IdDocument следующим образом:
((Passport) idDocument).getSomeMethod();
Итак, я извлек данные, которые содержит только дочерний класс.
Теперь, как я уже сказал, моя цель — захватить данные, но из дочернего класса passport с помощью IdDocument .
Комментарии:
1. Это было бы достаточно легко протестировать примерно с дюжиной строк кода Java.
2. На самом деле, я уже знаю ответ. Да, это возможно, потому что существует полиморфизм среды выполнения. Конечно, это относится в основном к наследованию.
3. На практике вам не обязательно знать родительский тип. Весь смысл использования интерфейса заключается в том, чтобы соответствовать интерфейсу, а не передавать тип интерфейса и затем приводить его в соответствие.
4. Если служба возвращает
IdDocument
, то что заставляет вас полагать, что это безопасно предположить, что этоSlPassport
? Почему бы не вернутьSlPassport
напрямую?
Ответ №1:
Если у вас есть класс A, класс B, который наследуется от A, и класс C, который наследуется от B, класс C также наследуется от A. Вот объяснение полиморфизма, которое имеет отношение к вашему вопросу.
Ответ №2:
Короткий ответ — да, при условии, что экземпляр действительно является SLPassport
экземпляром. Я бы также посоветовал вам явно проверить это перед приведением, чтобы избежать ClassCastException
s:
if (idDocument instanceof SLPassport) {
((SLPassport) idDocument).doSomethingSpecific();
} else {
System.err.println("Not an SLPassport"); // Or some better error handling
}
Ответ №3:
Объект SLPassport может быть приведен к: IdDocument, Passport, Object или SLPassport
Итак, если вы сделали что-то вроде:
Passport myPass = new SLPassport();
SLPassport mySlPass = (SLPassport) myPass;
это было бы допустимо.