Задать вопрос

Как реализовать динамический кастинг типа возвращаемого методом в Java?

Приведу пример задачи, чтобы ясно обозначить суть вопроса. Я новичок в Javа, поэтому прошу сильно не пинать, но сил уж нет и гугл не помогает :)

Итак. Представим, что есть множество реализаций интерфейса ICompany: CompanyImplA, CompanyImplB и т.д.

Мне необходимо написать некий метод, который возвращал бы объект одного из этих классов (CompanyImplA, CompanyImplB и т.д.), но при этом этот метод изначально не должен точно знать, объект какого типа будет приходить внутри него.

Постараюсь изобразить требуемое в коде
// Тип возвращаемого объекта должен каким-то образом определяться в заголовке метода (но как?)
public ТутОднаИзРеализацийICompany getCompany() {
   ICopmany company = CompanyContainer.getCurrentCompany(); // возвращает ICompany

   // далее каким-то образом кастим company из ICompany в ОднаИзРеализацийICompany, возможно получив исходный класс посредством company.getClass()

   return company; // и возвращаем уже объект приведенного типа 
}

Чувствую, что вопрос проще пареной репы и ответ лежит на поверхности. Поправьте меня, пожалуйста, если я совсем глубоко в чем-то ошибаюсь.
  • Вопрос задан
  • 2994 просмотра
Подписаться 5 Оценить 2 комментария
Решения вопроса 1
Не делайте так. Интерфейс для того и нужен, чтобы не иметь дело с деталями реализации. Используйте ICompany - и всё. Если в интерфейсе ICompany чего-то не хватает, то добавьте. Считайте Impl внутренними классами, недоступными клиентскому коду.

Если же вам действительно нужны разные реализации в клиентском коде, то вам не нужен интерфейс ICompany.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mrstrictly
@mrstrictly
Я не до конца понимаю контекст вашей задачи, но однозначно видно, что вам не помешает углубиться в параметризованные типы. :)
Подозреваю, вы хотите это:
<T> T getCompany() {
    return (T) CompanyContainer.getCurrentCompany();
}

Однако, обратите внимание, что явные преобразования типов, чаще всего — признак плохого дизайна.
Ответ написан
ivanm
@ivanm Автор вопроса
Контекст задачи - создание модульного приложения, в котором в зависимости от значения внешнего параметра переключаются реализации одного из Интерфейсов (реализации которых и есть модули). Работаю со Spring Framework, в частности с Spring MVC. А реализации класса ICompany это есть спринговские бины.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы