我正在尝试实现此代码:
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中的正确方法?
答案 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次通话,否则不会出现问题