java - 如何使用 instanceof 比较对象但使用接口(interface)类型(不传递确切的类名。)

标签 java interface compare delegation instanceof

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 运算符时出现错误。我不希望每个组件都想要比较列表,但我想将该任务委托(delegate)给 AppMnger,因为他知道它创建的组件。 艾米的想法?

最佳答案

我认为你应该重新设计 getComponent采取Class<? extends Component>而不是 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());
}

编辑:如果您实际上只想检查 exact 类,则不需要 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.
}

不过,我仍然会建议使用此方法签名 - 必须已经拥有一个组件的实例才能找到输入你想要的。

关于java - 如何使用 instanceof 比较对象但使用接口(interface)类型(不传递确切的类名。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18888787/

相关文章:

c++ - 比较c++中的两个数组并根据元素的匹配或不匹配返回值

c# - Compare() 方法,Parent 和 Children 对象排序不完美

java - Eclipse 插件项目中的类可见性

python - 包装一个接受指针数组的函数

go - 无法将实现 Foo 接口(interface)的结构 slice 传递给需要 []Foo 的函数

C++ 在列表中查找 double

java - 如何在java中调度动态任务

java - 关机时线程自杀?停止 java.util.Timer 实例

java - 无法编译for循环

c++ - 使用接口(interface)从 dll 中导出类