【发布时间】:2010-05-06 10:38:41
【问题描述】:
我有这个简单的接口/类:
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);
我怎样才能获得它?有可能吗?
【问题讨论】:
-
请清理格式!您已将代码格式化为代码、块引用和正文。
-
"我希望 p.handler(m) 调用方法 p.handler(m:Message1)" -- 这不是 Java 的工作方式! Java 是单一调度的!
-
由 rsp 回答 - 顺便说一句,根据我的经验,方法重载在 Java 中经常被滥用。容易出现问题,特别是对于这里的类/子类重载。仅在需要或增加一些价值时使用它。有些人在不需要的情况下使用重载,认为它有点优雅。它不是。 stackoverflow.com/questions/248222/…
标签: java reflection subclass instanceof superclass