4
import java.util.Collection;


public class Test
{
    public static void main(String[] args)
    {
        Collection c = null;
        Test s = null;

        s = (Test) c;
    }
}

上記のコード サンプルでは、​​コレクション オブジェクトを Test オブジェクトにキャストしています。(null ポインターを無視します)。Test はCollection とは何の関係もありませんが、このプログラムはすべてのコンパイル時のチェックに合格します。

これはなぜだろうと思います。私の推測では、インターフェイスは複雑すぎるため無視されます。それらには共通のスーパータイプがなく、各クラスは複数のインターフェースを実装できるため、クラス/インターフェース階層が複雑すぎて効率的に検索できませんか?

その理由以外は、私は困惑しています。誰か知っていますか?!

4

3 に答える 3

8

ここでは「非最終」がキーワードです。別のクラスがあるかもしれません

public class Test2 extends Test implements Collection

sそのインスタンスは、キャストを完全に合法にするために割り当てられることになります。

于 2009-08-05T18:54:43.750 に答える
3

のサブクラスはTest潜在的に のサブタイプにもなり得るからCollectionです! 言語仕様は、実行時に検証できるキャストを許可するために少し柔軟になるように設計されています。

于 2009-08-05T18:55:00.240 に答える