了解铸造问题的问题

时间:2011-05-19 19:24:50

标签: java casting

有人可以向我解释评论中的两行是如何编制的吗?

A a = new A();
B b = new B();
C C = new C();

// How can these work?
((G) a).methodG(a);
((B) a).methodG(a);

public class A {
    A methodA() {
        return this;
    }
}
public class B extends A implements G {
    B methodB(A a) {
        return this;
    }
    public G methodG(A a) {
        return (G) this;
    }
}

public class C implements G{
    C methodC(G g) {
        return this;
    }
    public G methodG(A a) {
        return (G) this;
    }
}

public interface G {
    G methodG(A a);
}

1 个答案:

答案 0 :(得分:4)

他们不会工作。你会得到一个ClassCastException。

编译好,因为编译器不知道a不是A的子类也实现了G(例如B)。但是,在运行时,当您尝试强制转换时,它将失败。

除非绝对没有选择,否则这是人们不应该施展的重要原因之一。它打破了编译器带来的很多类型安全性。