shahidbits:
次の例では、なぜコンパイラはキャストのエラーを報告しませんx
にD
?
interface X {}
class C implements X {}
class D {}
public class CastIssue {
public static void main(String[] args) {
X x = new C();
// why is there no error here?
D d = (D) x;
}
}
私たちが行った場合でも、X
クラスを、コンパイラはエラーを報告します。
class X {}
class C extends X {}
class D {}
public class CastIssue {
public static void main(String[] args) {
X x = new C();
// this gives a compile-time error
D d = (D) x;
}
}
kaya3:
以下からのキャストX
にD
オブジェクトが両方のインスタンスですることが可能だから許されるX
とD
。例えば:
class E extends D implements X {}
X x = new E();
D d = (D) x; // no problem here, because an X can be a D too
あなたの例では、キャストは一連の文から判断することができますコンパイル時に型を決定するとき、それは制御の流れを考慮していないので、Javaができない失敗、しかし。
しかし、あればX
、その後、クラスであるためX
とD
オブジェクトの両方が関係のないクラスのインスタンスであるために(Javaはクラスのための多重継承を許可していません)は、共通のサブクラスを持っていないだろう、それは不可能だろう。コンパイル時の型に基づいて、キャストは(しない限り、決して成功しない可能性があるため、その場合には、キャストが許可されていないx
ですnull
)。