1

我有这段代码(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
4

3 回答 3

3

cl很可能是因为is的静态类型Class<?>(实际上是Class<Object>),而Child.classis的静态类型Class<Child>。编译器仅根据它看到的静态类型来选择要调用的方法,而不是根据对象的实际类型。

所以将你的变量声明为

Class<Child> cl = Child.class;

应该会给您预期的结果。

于 2012-09-11T08:15:00.507 回答
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();
    }
}: 

虽然你有一个对象容器,但现在的输出是: 我已经处理了一个孩子

于 2012-09-12T08:21:08.233 回答
0
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
    throw new ClassCastException();
return (T) obj;
}

当这样写时:

Class<?> cl = Child.class;  

T被Object替换,所以返回(Object)obj;

于 2012-09-11T08:26:05.563 回答