Проблема понимания решающего вопроса
Может ли кто-нибудь объяснить мне, как компилируются две строки под комментарием?
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 ответ:
Они не будут работать. Вы получите ClassCastException.
Он будет компилироваться нормально, так как компилятор не знает наверняка, что a не является подклассом A, который также реализует G (например, B). Однако во время выполнения, когда вы пытаетесь бросить, это не удастся.
И это, в частности, одна из главных причин, по которой люди не должны бросать, если нет абсолютно никакого выбора. Это нарушает большую часть безопасности типов, которую вы получаете с компилятором.