要从中选择的接口集合,Java

要从中选择的接口集合,Java,java,Java,考虑一下,包装在DataContainer中的对象将被分发给客户机 // Will be handed out public interface DataContainer 为了使用它,客户端当前需要知道将对象强制转换为: public interface ConcreteObject_1_Container extends DataContainer public interface ConcreteObject_2_Container extends DataContainer 是否可

考虑一下,包装在
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); 

如果您可以将GetConataIner设置为泛型方法,那么它将能够使用类型推断返回特定类型。

您可能应该更改您的设计。要么:

  • 客户端只使用数据容器上的方法,而不关心它是什么实现,在这种情况下可以避免强制转换,或者
  • 客户机实际上是耦合到实现的,因此应该直接使用实现类型(例如,使用两种不同的方法)

  • 一个方法可以有1个返回类型,该类型是
    GenericContainer
    DataContainer
    是否有第三个实现?如果没有,就不需要了解实现,您可以将客户端需要的所有方法都放在接口中。问得好。“否”
    DataContainer
    的唯一用途是充当
    getcontainer中的返回类型,用于
    方法。但是,
    ConcreteObject1Container
    列出了具体返回类型为
    A
    的方法,而
    ConcreteObject2Container
    列出了具体返回类型为
    B