5

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

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”,所以是子类而不是超类。

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

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

但输出是

> Interface: Message

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

我会这样的正确命令:

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

我怎样才能获得它?这是可能的?

4

2 回答 2

9

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

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 接口的类型。

于 2010-05-06T10:55:40.853 回答
0

我不确定您的 handle(..) 方法应该做什么,但由于它们依赖于 Message 的特定实例,您应该考虑将 handle() 方法添加到 Message 类(作为抽象方法)。这样,每条消息都实现了自己的句柄版本,您可以享受多态的好处:

Message m = new Message1();
m.handle();

此代码将根据需要返回“Class: Message1”。

于 2010-05-06T11:02:25.707 回答