Как привести родительско-дочерние классы в Java?

#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;
  

это было бы допустимо.