Looks like you can use double dispatching.
Instead of returning a value (ie, Object), you return void and pass as a parameter a target object you want your result to be put into.
interface ResultProcessor {
processTypeA(A item);
processTypeB(B item);
processTypeC(C item);
}
interface InputProcessor {
processInput(ResultProcessor target);
}
class ConcreteInputProcessorA {
processInput(ResultProcessor target) {
A result = ...; // Do something
target.processTypeA(result);
}
}
class ConcreteInputProcessorB {
processInput(ResultProcessor target) {
B result = ...; // Do something
target.processTypeB(result);
}
}
class ConcreteInputProcessorC {
processInput(ResultProcessor target) {
C result = ...; // Do something
target.processTypeC(result);
}
}
Update: For example with your new edited code you may write:
public class AddOp implements IOperation{
private int a;
private int b;
private int c;
public AddOp(int a, int b){
this.a = a;
this.b = b;
}
@Override
public void execute(Executor ex) {
this.c = this.a + this.b;
ex.executeAddOp(this);
}
}
public class Executor {
public void executeAddOp(AddOp op) {
System.out.println("Executing an AndOp... " + op);
}
}