Так что у меня локатор сервиса, чтобы найти фабрики (здесь реестра):Построение службы локатора (реестра) для общих заводов
public interface Registry {
void addFactory(Factory<? extends Component> factory);
Factory<? extends Component> getFactory(String name);
}
И фабричные:
public interface Factory<C extends Component> {
C createComponent();
void render(C);
}
и использовать их таким образом, :
Registry registry;
public <X extends Component> void createIt(String name) {
Factory<X> factory = (Factory<X>)registry.getFactory(name); //<- I need to cast this
X component = factory.createComponent();
//..do something to component as it's a Component
factory.render(component)
}
Я не смог найти способ захватить этот общий метод. Информация должна быть там, чтобы знать, что все, что завод возвращает (X
), может быть возвращено на завод, не зная, что это такое. Я пробовал много разных подходов без каких-либо успехов, рано или поздно получаю предупреждение.
Edit:
Вот пример того, как заводы выглядеть так:
public class SimpleFactory implements Factory<SimpleComponent> {
public SimpleComponent createComponent() {
return new SimpleComponent();
}
public render(SimpleComponent sc) {
sc.doInThisSC();
}
}
второй завод может выглядеть следующим образом:
public class ComplexFactory implements Factory<ComplexComponent> {
public ComplexComponentcreateComponent() {
return new ComplexComponent();
}
public render(ComplexComponent cc) {
cc.doInThisCC();
}
}
Я пытаюсь выразить, что factory.render(factory.createComponent())
должен всегда работать независимо от того, что я могу сделать с любой фабрикой, полученной из реестра.
'(Factory) registry.getFactory (имя); 'всегда будет давать непроверенное предупреждение –
Ramanlfc
@Ramanlfc да, вопрос в том, могу ли я изменить подписи, так что мне не нужно его бросать. – estani