2009-09-29 7 views
18

私は、コンパイル時の例外をスローしません、次のようにその何かを見つけるためにいくつかのコードをデバッグするときに、以前の今日びっくりしました:あなたが想像できるようにこれはなぜコンパイルされますか?

public Test() { 
    HashMap map = (HashMap) getList(); 
} 

private List getList(){ 
    return new ArrayList(); 
} 

ClassCastExceptionは、実行時にスローされますが、誰かをすることができますListからHashMapへのキャストがコンパイル時に合法であると思われる理由を説明してください。

+0

http://stackoverflow.com/questions/19895304/classcastexception-vs-cannot-cast-compilation-error/37190861#37190861 –

答えて

29

おそらくgetList()HashMapのサブクラスを返していて、Listも実装している可能性があります。おそらく、はい、しかし可能なので、コンパイル可能です。

+9

+1:明示的なキャストは、基本的に、プログラマがコンパイラ「Iコンパイラがあなたが本当に間違っていることを知らないなら、私のやり方を知ってください。まあ、それは私に説明された一つの方法です。 – weiji

+3

ええ、 'List'を' ArrayList'に置き換えるとコンパイラは文句を言うべきです。 –

+0

@weiji:これはある程度真実で、CやC++よりもはるかに真実です。 Javaコンパイラはあなたにロープを与えるだけで、AがおそらくBのインスタンスにはならない場合、コンパイルされません。 – skaffman

17

リストはインターフェイスです。 Listインタフェースを実装するHashMapのサブクラスが存在しない理由はありません。この状況では、それは完全に有効です。

関連する問題