1
interface Foo {}
class Alpha implements Foo {}
class Beta extends Alpha {}

class Delta extends Beta {
    public static void main( String[] args ) {
        Beta x = new Beta();
        Foo f=(Delta) x; 
    }
}

なぜClassCastExceptionここで発生するのですか?

4

3 に答える 3

6

シンプルな英語でコードを書いてください:

フー

アルファIS-Aフー

ベータIS-Aアルファ

デルタIS-Aベータ

ノート:

ベータはデルタではありません

ここで行を変更します。

Foo f = (Delta) x; 

お役に立てれば。ご不明な点がございましたら、お知らせください。

于 2013-07-23T14:35:07.627 に答える
2

あなたはJLS §5.5.3ClassCastExceptionに従って を受け取っています:

Rオブジェクトの実行時の型が、キャスト演算子で指定された型Tの消去 ( §4.6 ) である型と互換性のある代入であるかどうかをチェックするアルゴリズムを次に示します。実行時例外がスローされた場合、それはClassCastException.

R通常のクラス (配列クラスではない) の場合:

  • Tがクラス型の場合R、 と同じクラス ( §4.3.4 )Tまたは のサブクラスである必要があります。そうでないT場合、実行時例外がスローされます。

  • ...

...

あなたの場合、RisBetaTisDeltaです。Betaは のサブクラスではないことに注意してくださいDelta

于 2013-07-23T14:33:26.267 に答える
1

xas Deltabut xis of type をキャストしていますがBeta、これは拡張されてDeltaおり、その逆ではありません。したがって、あなたのClassCastException.

ところで、ガンマはどうしたの?

于 2013-07-23T14:34:52.017 に答える