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/