Как улучшить подстановочную подпись Java generics

#java #generics #containers #wildcard

#java #дженерики #контейнеры #подстановочный знак

Вопрос:

Я пытаюсь создать метод DI container get , но у меня проблемы с подписью. В настоящее время у меня есть это определение:

 public Object get(Class<?> key) {
  // returns instance of `?`
}
  

Часть моего кода, которая мне не очень нравится, — это использование get метода:

 IRouter router = (IRouter) container.get(IRouter.class);
  

где я должен привести return с (IRouter) . Есть идеи, как изменить сигнатуру метода, чтобы сделать использование подобным этому?

 IRouter router = container.get(IRouter.class);
  

Заранее спасибо за любые идеи!

Ответ №1:

Используя метод с ограниченной областью действия, параметризованный тип :

 public <T> T get(Class<T> key) {
  // ...
  return (T) foo;
}
  

Здесь, я полагаю, это foo не вводится как T .
Если она уже введена как T , вы, конечно, можете вернуть ее без приведения.

Вы могли бы вызвать ее таким образом :

 IRouter router = container.get(IRouter.class);
  

Комментарии:

1. Добро пожаловать 🙂 Я советую вам загрузить исходный код из классов Spring core. Это должно помочь вам в соответствии с вашими требованиями.

2. Да, конечно 🙂 но я просто играю с Java как разработчик PHP и пытаюсь проверить свои концепции ООП так быстро, как только могу выделить себе свободное время : D