Проблема понимания решающего вопроса


Может ли кто-нибудь объяснить мне, как компилируются две строки под комментарием?

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   2  

1 ответ:

Они не будут работать. Вы получите ClassCastException.

Он будет компилироваться нормально, так как компилятор не знает наверняка, что a не является подклассом A, который также реализует G (например, B). Однако во время выполнения, когда вы пытаетесь бросить, это не удастся.

И это, в частности, одна из главных причин, по которой люди не должны бросать, если нет абсолютно никакого выбора. Это нарушает большую часть безопасности типов, которую вы получаете с компилятором.