java - 反射:将对象转换为子类而不使用 instanceof

标签 java reflection subclass instanceof superclass

我有这个简单的接口(interface)/类:

public abstract class Message {}

public class Message1 extends Message {}

public class Message2 extends Message {}

还有一个实用类:

public class Utility {
    public void handler(Message m) {
        System.out.println("Interface: Message");
    }

    public void handler(Message1 m) {
        System.out.println("Class: Message1");
    }

    public void handler(Message2 m) {
        System.out.println("Class: Message2");
    }
}

现在,主类:

public static void main(String[] args) {

    Utility p = new Utility();

    Message1 m1 = new Message1();
    p.handler(m1);

    Message m = (Message) m1;
    p.handler(m);

}

输出是

> Class: Message1
> Interface: Message

我希望 p.handler(m) 调用方法 p.handler(m:Message1)

我不想使用“手动”命令 instanceof 因为我有很多情况:

if(m instance of Message1)
p.handler((Message1)m)
else if (m instanceof Message2)
p.handler((Message2)m)
...

如果我调用 m.getClass(),我将获得“mypackage.Message1”,因此是子类而不是父类(super class)。

我尝试使用这段代码(使用反射):

p.handler(m.getClass().cast(m));

但是输出是

> Interface: Message

所以,这是我的问题。我会在不使用“代码命令”istanceof 的情况下将父类(super class)对象运行时转换为子类对象。

我想要这样一个正确的命令:

p.handler((m.getclass)m);

如何获得?可能吗?

最佳答案

Java 将根据编译时已知的信息调用方法。您可以做的是向接口(interface)添加一个方法,为对象调用正确的处理程序方法。

public abstract class Message {

    public abstract void callHandler(Utility utility);

}

public class Message1 extends Message{

    public void callHandler(Utility utility) {
        utility.handler(this);
    }
}

您对处理程序的调用变为:

Message m=(Message) m1;
m.callHandler(p);

现在调用 Utility::handler(Message1),即使 main 中的引用是 Message 接口(interface)的类型。

关于java - 反射:将对象转换为子类而不使用 instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2780381/

相关文章:

java - 二维数组,其单元格可以在索引处保存超过 1 个值

java - 随机文本应用程序连续显示相同文本 2 次或更多次

java - 如何按复杂键对多重映射进行排序?

java - 从另一个方法动态初始化 POJO

java - 具有类和子类空错误的数组

java - SecurityManager 是一个完整的安全解决方案吗?

swift - 在 Swift 中获取对象的类名作为字符串

c# - 如何获取实现给定接口(interface)的所有加载类型的所有实例?

Javascript 继承 - 重叠基类变量

javascript - Knockout - 通过设置对象的属性来更改对象的 'subclass'