jfa*_*zio 4 java reflection subclass instanceof superclass
我有这个简单的接口/类:
public abstract class Message {}
public class Message1 extends Message {}
public class Message2 extends Message {}
Run Code Online (Sandbox Code Playgroud)
一个实用类:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,主要类:
public static void main(String[] args) {
Utility p = new Utility();
Message1 m1 = new Message1();
p.handler(m1);
Message m = (Message) m1;
p.handler(m);
}
Run Code Online (Sandbox Code Playgroud)
输出是
> Class: Message1
> Interface: Message
Run Code Online (Sandbox Code Playgroud)
我会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)
...
Run Code Online (Sandbox Code Playgroud)
如果我调用m.getClass()我获取"mypackage.Message1",那么子类而不是超类.
我尝试使用此代码(使用反射):
p.handler(m.getClass().cast(m));
Run Code Online (Sandbox Code Playgroud)
但输出是
> Interface: Message
Run Code Online (Sandbox Code Playgroud)
所以,这是我的问题.我会做一个超类对象的运行时强制转换为subclassobject而不使用"code command"istanceof.
我会这样一个正确的命令:
p.handler((m.getclass)m);
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得它?这是可能的?
Java将根据编译时已知的信息调用该方法.您可以做的是向接口添加一个方法,该方法为对象调用正确的处理程序方法.
public abstract class Message {
public abstract void callHandler(Utility utility);
}
public class Message1 extends Message{
public void callHandler(Utility utility) {
utility.handler(this);
}
}
Run Code Online (Sandbox Code Playgroud)
您对处理程序的调用变为:
Message m=(Message) m1;
m.callHandler(p);
Run Code Online (Sandbox Code Playgroud)
现在调用Utility :: handler(Message1),即使main中的引用是Message接口的类型.