Java - 向下转向任意类?

时间:2013-04-06 01:07:17

标签: java downcast

我正在尝试实现此代码:

 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中的正确方法?

2 个答案:

答案 0 :(得分:1)

您必须明确(向下)施放,具体取决于您确定您的对象是否来自的类:

public void register(Action action) {
    if (action instanceof ActionType1A) {
        ActionTypeOne.doSomething((ActionType1A) action);
    } else if (action instanceof ActionType1B) {
        ActionTypeOne.doSomething((ActionType1B) action);
    }
}

答案 1 :(得分:1)

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

大约代码:

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

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

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

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

这将起作用,因为只在运行时检查实际对象的类型是否正确。但代码会稍慢。除非您需要几个CPU周期或有1,000次通话,否则不会出现问题