なぜ我々はここで、鋳造のためのコンパイル時エラーを取得しませんか?

shahidbits:

次の例では、なぜコンパイラはキャストのエラーを報告しませんxD

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:

以下からのキャストXDオブジェクトが両方のインスタンスですることが可能だから許されるXD例えば:

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、その後、クラスであるためXDオブジェクトの両方が関係のないクラスのインスタンスであるために(Javaはクラスのための多重継承を許可していません)は、共通のサブクラスを持っていないだろう、それは不可能だろう。コンパイル時の型に基づいて、キャストは(しない限り、決して成功しない可能性があるため、その場合には、キャストが許可されていないxですnull)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=277896&siteId=1