我有这段代码(Child只是Object的空子),我不明白为什么最后一次调用没有给出与第二次调用相同的结果
感谢您的帮助
public class App {
void process(Object o) {
System.out.println("I have processed an object");
}
void process(Child c) {
System.out.println("I have processed a child");
}
public static void main (String[] args) {
Object o = new Child();
Class<?> cl = Child.class;
App app = new App();
app.process(o);
app.process(Child.class.cast(o));
app.process(cl.cast(o));
}
}
输出
I have processed an object
I have processed a child
I have processed an object
答案 0 :(得分:3)
很可能是因为cl
的静态类型是Class<?>
(实际上是Class<Object>
),而Child.class
的静态类型是Class<Child>
。编译器选择仅基于它看到的静态类型调用的方法,而不是基于对象的实际类型。
将您的变量声明为
Class<Child> cl = Child.class;
应该给你预期的结果。
答案 1 :(得分:1)
您应该使用Java反射来执行此操作
public static void main(String[] args) {
Object o = new Child();
App app = new App();
try {
Method m = App.class.getMethod("process", o.getClass());
m.invoke(app, o);
} catch (Exception e) {
e.printStackTrace();
}
}:
虽然您有一个Object容器,但输出现在是: 我处理了一个孩子
答案 2 :(得分:0)
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException();
return (T) obj;
}
写的时候:
Class<?> cl = Child.class;
T被Object替换,所以return(Object)obj;