0

我正在尝试实现此代码:

 public void ActionTypeOne {

   doSomething(ActionType1A action) { ... }
   doSomething(ActionType1B action) { ... }

  }

...

   public void register(Action action) {

        if (action.getClass().equals(ActionType1A) || action.getClass().equals(ActionType1b)) {
            ActionTypeOne.doSomething(action);
        }

   }

由于 ActionTypeOne 没有实现 doSomething(Action),而只是 doSomething(ActionType1A) 和 doSomething(ActionType1B),所以这段代码不会编译。

但是,由于事先的代码,我知道我的对象绝对是这些类型之一。我可以将其拆分并显式转换为我的两个 ActionType 之一,但这很麻烦。

我可以强制这条线:

ActionTypeOne.doSomething(action) 

根据动作类调用 ActionTypeOne 中的正确方法?

4

2 回答 2

1

您可以使用反射来获取这些方法,然后调用它们。

大约代码:

//in class init or static
Class []params1 = new Class {ActionType1A};
Method doSomethingActionType1A = ActionTypeOne.class.getDeclaredMethod("doSomething", params1);

//...等 // 如果你有超过 3 个,你可以将它们添加到哈希映射中,以根据类名获取正确的方法

//当你需要调用时 - 通过 if 或 hash table 获取方法然后调用它

method1.invoke(Object obj, Object... args);

这将作为调用仅在运行时检查实际对象的类型是否正确。但代码会稍微慢一些。除非您关心几个 CPU 周期或有 1,000 次调用,否则这不是问题

于 2013-04-07T22:31:48.683 回答
1

您必须根据您确定对象实例化的类显式(向下)转换:

public void register(Action action) {
    if (action instanceof ActionType1A) {
        ActionTypeOne.doSomething((ActionType1A) action);
    } else if (action instanceof ActionType1B) {
        ActionTypeOne.doSomething((ActionType1B) action);
    }
}
于 2013-04-06T01:24:35.137 回答