java .cast方法的不同行为

时间:2012-09-11 08:11:24

标签: java casting

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

3 个答案:

答案 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;