我有一个代码迭代一些类型的对象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
}
Run Code Online (Sandbox Code Playgroud)
不,我正在添加一个处理类型结果的流程,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
}
Run Code Online (Sandbox Code Playgroud)
问题是 - 我不能使用这种方法,因为我不知道是哪种类型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 }
Run Code Online (Sandbox Code Playgroud)
但是我不能这样做,因为调用是根据静态类型而不是动态类型设置的(因此我总是会遇到Object重载).
有没有一个很好的模式来处理这种情况而不改变现在不是一个选项的原始类?
小智 4
它并不是很优雅,但是您可以使用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();
}
Run Code Online (Sandbox Code Playgroud)