代码之家  ›  专栏  ›  技术社区  ›  PeterMmm

在运行时通过反射向下转换

  •  0
  • PeterMmm  · 技术社区  · 16 年前

    考虑以下代码

       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” .

    2 回复  |  直到 16 年前
        1
  •  6
  •   Jon Skeet    16 年前

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

    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
    }
    
        2
  •  0
  •   matt b    16 年前

    不。强制转换不会更改对象的类型,它只会更改引用的类型。

    例如,此代码:

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

    不需要 b 并强行使其成为 A ,然后致电 doSomething() 方法。强制转换所做的只是允许您引用类型为的对象 B .