动态转换为未知类Java

时间:2018-10-25 11:09:12

标签: java casting

建议使用switch或if-else语句来回答所有其他此类问题,我想完全避免。 因此,我有一个带有两个重载方法的客户端类,该方法使用某些接口实现的两个不同实例。为简单起见:

public interface MyInterface<R extends Register> {

Object myServiceMethod(R register);

然后有一个具有两种方法的客户端

    public Double methodName(Class1 name1)
    public Double methodName(Class2 name2)

Class1和Class2都实现Register的地方。在MyService实现中,我需要做的是调用正确的方法,而无需先验地知道它将获得哪个类

public class MyServiceImplementation implements MyInterface<Register>{
@Override
public Object myServiceMethod(Register myRegister){
return myClient.methodName(*and here is a place for magic)
}

我需要做类似的事情:

return myClient.methodName((myRegister.getClass()) myRegister);

但是,由于这是非法的-我的问题在这里。

2 个答案:

答案 0 :(得分:0)

这闻起来糟糕的面向对象设计,但是这里是您要做什么的方法。基本上,您似乎正在尝试在编译时执行运行时多态,而这在Java中不起作用。 (某些动态语言,例如Groovy可以做到。)因此,您需要明确地进行区分:

if (myRegister instanceOf Class1)
    myClient.methodName((Class1) myRegister);  // Selects this overload at compile time
else if (myRegister instanceOf Class2)
    myClient.methodName((Class2) myRegister);
else
    throw new RuntimeException("Unrecognized type: " + myRegister.getClass());

答案 1 :(得分:0)

更改您的客户代码。

更改:

public Double methodName(Class1 name1)
public Double methodName(Class2 name2)

收件人:

public Double methodName(Register register)