1
public interface Component{}

public class AppManager {


  public void doWork(){
    SomeComponent comp = new SomeComponent ();
    AddComponentToList(comp);

  }

  public void AddComponentToList(Component compo){
     componentList.add(compo);
  }

  /* Give me the component I want. */
  public Component getComponent(Component comp){
    for (Component component : getComponentList()) {

        if (component instanceof comp) {
          return component;  
        }

    }


  }

   private ArrayList<Component> componentList  = new ArrayList<Component>();

}

public class SomeComponent implements component {

  public void MyMethod() {

     appManager.getComponent(SomeComponent );
  }


  public void setAppMnger(AppManager appm){
     this.appManager = appm;
  }

  private AppManager appManager ;
}

在上面的代码中,AppMnger 有一个组件列表。组件相互通信。因此,如果一个组件想知道另一个组件实例,它会调用 AppMnger getComponent(comp) 方法。但是当我使用 instanceof 运算符时出现错误。我不希望每个组件都比较列表,但我想将该任务委托给 AppMnger,因为他是知道它创建的组件的人。艾米想?

4

3 回答 3

3

我认为您应该重新设计getComponent以采用 aClass<? extends Component>而不是 a Component。然后你可以使用isInstance

public Component getComponent(Class<? extends Component> componentClass) {
    for (Component component : getComponentList()) {
        if (componentClass.isInstance(component)) {
           return component;  
        }
    }
    return null; // Or throw an exception, potentially.
}

SomeComponent会使用:

appManager.getComponent(SomeComponent.class);

如果你真的想使用一个实例,你可以像这样重载方法:

public Component getComponent(Component existingComponent) {
    return getComponent(existingComponent.getClass());
}

编辑:如果您实际上只想检查确切的类,则不需要instanceof类似行为-您只需要:

public Component getComponent(Class<? extends Component> componentClass) {
    for (Component component : getComponentList()) {
        if (componentClass == component.getClass()) {
           return component;  
        }
    }
    return null; // Or throw an exception, potentially.
}

不过,我仍然建议使用此方法签名 - 必须已经一个组件的实例才能找到所需类型的组件,这感觉很奇怪。

于 2013-09-19T07:39:44.057 回答
2

如果您希望该类完全匹配(List!= ArrayList),请使用以下命令:

if (comp.getClass().equals(component.getClass())) ...

如果你想让它像 instanceof (List => ArrayList) 一样工作,那么你可以试试这个:

if (comp.getClass().isInstance(component)) ...
于 2013-09-19T07:40:28.467 回答
0

我想 Black,max 和 Jon 之前的回答足以满足您的比较部分,因为“我不希望每个组件都想要比较列表,但我想将该任务委托给 AppMnger,因为他是知道的人“ 您可以尝试使用访问者设计模式。

于 2013-09-19T07:56:29.850 回答