建物とコードを拡張するクラス Cottage を想像してみてください
Building building = new Building();
Cottage cottage = (Cottage)building;
ここで、 Java の継承の性質を考慮すると、 BuildingをCottageにキャストできないことは完全に理にかなっていますが、(私にとって) 理にかなっていないのは、これがコンパイルされることです。コンパイルして実行時にClassCastExceptionをスローするのはなぜですか?
実際にプログラムを実行する前に、 Building が Buildingオブジェクトへの参照であることは明らかではないでしょうか。
このような一般的な質問であるため、これが重複している可能性があることはわかっています:)しかし、なぜコンパイルするのかという質問に対する答えが見つかりませんでした:)
EDIT2私はここで素晴らしい答えを受け入れました(その下の議論は言うまでもありません:))が、コンパイルエラーではなく実行時エラーが発生するJavaキャストで受け入れられた答えが最も興味深い...
EDIT IllegalCastExceptionを編集し、正しいClassCastExceptionを配置しました