在运行时使用反射进行转换

时间:2009-11-03 16:42:21

标签: java reflection casting

考虑以下代码

   public class A {

    public static void main(String[] args) {
        new A().main();
    }

    void main() {

        B b = new B();
        Object x = getClass().cast(b);

        test(x);
    }

    void test(Object x) {
        System.err.println(x.getClass());
    }

    class B extends A {
    }
}

我预计输出“A级”,但我得到“A $ B级”

有没有办法将对象x转换为A.class,所以当在方法调用中使用时,运行时会认为x是A.class?

2 个答案:

答案 0 :(得分:6)

强制转换不会更改对象的实际类型。例如:

String x = "hello";
Object o = (Object) x; // Cast isn't actually required
System.out.println(o.getClass()); // Prints java.lang.String

如果您希望实际的对象只是A的实例,则需要创建A的实例。例如,您可能有:

public A(B other) {
    // Copy fields from "other" into the new object
}

答案 1 :(得分:0)

没有。转换不会更改对象的类型,只会更改您引用的类型。

例如,此代码:

B b = new B();
A a = (A) b;
a.doSomething();

不将b强行转换为A的实例,然后在A类中调用doSomething()方法。所有强制转换都允许您引用B类型的对象,就好像它是A类型一样。

您无法更改对象的运行时类型。