【问题标题】:Dynamic cast to uknown class java动态转换为未知类java
【发布时间】:2018-10-25 19:46:20
【问题描述】:

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

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

【问题讨论】:

  • 试试myRegister.getClass().cast(myRegister)
  • Class1 和 Class2 扩展同一个基类吗?方法的实现有什么不同吗?
  • 为什么不使用 Object 类?然后将其转换为相应的类。
  • 对不起,忘了说Class1和Class2都实现了Register
  • 那么你为什么要区分它们呢?

标签: java casting


【解决方案1】:

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

【讨论】:

  • 这是我目前想避免的解决方案,但从您回答的语气中,我知道没有更好的办法了。还是谢谢你!
【解决方案2】:

更改您的客户端代码。

变化:

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

收件人:

public Double methodName(Register register)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2011-12-29
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多