我有一个代码可以迭代一些 MyType
类型的对象:
// result is of type Map<Long, MyType>
for (final Map.Entry<Long, MyType> someMyTypeObject: result.entrySet() {
// Do a bunch of stuff
Status status = someMyTypeObject.getStatus();
// Do some more stuff
}
不,我正在添加一个流程来处理 Map<Long, MyNewType>
类型的结果这需要做完全相同的事情,而唯一的区别是返回状态的方法的名称不同(比方说 - getObjectStatus()
而不是 getStatus()
)。我无法更改任何一种方法的名称。
我想做这样的事情:
public <T> doIterationWork(Map<Long, T> result) {
// Do a bunch of stuff
Status status = someMyTypeObject.getStatus();
// Do some more stuff
}
问题是 - 我无法使用此方法,因为我无法判断哪种类型是 T
.我考虑过重载 3 个方法:
public void getStatus(MyType obj) { return obj.getStatus(); }
public void getStatus(MyNewType obj) { return obj.getObjectStatus(); }
public void getStatus(Object obj) { // throw exception }
但我不能这样做,因为调用是根据静态类型而不是动态类型设置的(因此我总是会遇到 Object
重载)。
是否有一个好的模式来处理这种情况而不改变现在不是一个选项的原始类?
最佳答案
这不是很优雅,但你可以使用 instanceof 检查类型,转换对象并调用相应的方法。
像这样:
Status status;
if (someMyTypeObject instanceof MyType) { // It's a MyType object
MyType myTypeObject = (MyType) someMyTypeObject;
status = myTypeObject.getStatus();
} else { // It's a MyNewType object
MyNewType myNewTypeObject = (MyNewType) someMyTypeObject;
status = myNewTypeObject.getObjectStatus();
}
关于Java - 当方法名称不同时将代码提取到泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22301132/