首页 > 解决方案 > 动态转换为 uknown 类 java

问题描述

通过建议使用 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);

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

标签: javacasting

解决方案


这听起来很糟糕的面向对象设计,但这里是如何做你所追求的。基本上,您似乎试图在编译时进行运行时多态性,这在 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());

推荐阅读