reflection:在不使用instanceof的情况下将对象强制转换为子类

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

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

我尝试使用此代码(使用reflection):

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

但输出是

 > Interface: Message 

所以,这是我的问题。 我会做一个超类对象的运行时强制转换为subclassobject而不使用“code command”istanceof。

我会这样一个正确的命令:

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

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

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

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

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

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