Коллекция интерфейсов для выбора, Java


Считайте, что объект, завернутый в DataContainer, будет передан клиенту

// Will be handed out
public interface DataContainer 

Чтобы использовать его, клиент в настоящее время должен знать, чтобы привести объект к:

public interface ConcreteObject_1_Container extends DataContainer
public interface ConcreteObject_2_Container extends DataContainer

Можно ли предложить и ConcreteObject1Container, и ConcreteObject2Container в качестве вариантов для выбора, подобно тому, как можно выбрать варианты Enum?

Вместо пользователь магически знает, как использовать FileContainer

                                   // user knows
FileContainer   fileContainer   = (FileContainer) 
                ContainerFactory.getContainerFor(DataSource.FILE, 
                                                 TREAT_AS_SOURCE);

Я бы хотел

                                  // user selects
FileContainer   fileContainer   = (GenericContainer.FileContainer) 
                ContainerFactory.getContainerFor(DataSource.FILE, 
                                                 TREAT_AS_SOURCE); 
2   3  

2 ответа:

Вероятно, вам следует изменить свой дизайн. Либо:

  1. клиент просто использует методы на DataContainer, не заботясь о том, какая это реализация, и в этом случае приведения можно избежать, или
  2. клиент фактически связан с реализацией, поэтому следует просто использовать типы реализации напрямую (например, с двумя различными методами)

Если вы можете сделать getConatainerFor универсальным методом,то он сможет возвращать определенный тип с помощью вывода типа.