2012-06-28 9 views
5

これはおそらく私の一部では簡単な誤解です。そして、私が使用しようとMap <String、String>を拡張しているインターフェイスにHashMap <String、String>をキャストすることができません

public interface IParams extends Map<String,String> { 
} 

IParams params = (IParams) new HashMap<String,String>(); 

は、構文を渡し、コンパイルが、実行時に、私は得る:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.foobar.IParams 

どこにどれ洞察

は、シンプルなインターフェイスを持っていますこの場合、ジェネリックの誤解はありますか?

+5

のタイプではないようIParamsはあなたがMapから派生インタフェースにもかかわらず、あなたはIParamsにキャストすることはできませんあなたのインターフェイスを実装していません。 – Marcelo

+0

マップを拡張する理由はありますか?あなたはどんな方法よりも優先されますか? – kosa

+0

ジェネリックを隠すインターフェイスを作成し、マップ文字列の定義を保持する(例では示されていない)インターフェイスを作成することです。 –

答えて

10

HashMapはあなたのインターフェイスIParamsを実装していないので、あなたはIParamsHashMapをキャストすることはできません。これはジェネリックとは関係ありません。

IParamsおよびHashMapは両方とも実装または拡張する意味で「兄弟」であるMapです。しかし、それはあなたがIParamsであるかのようにHashMapを扱うことを意味するものではありません。 IParamsインターフェイスにメソッドを追加するとします。

public interface IParams extends Map<String, String> { 
    void someMethod(); 
} 

勿論、someMethodHashMapに存在しません。 HashMapIParamsをキャストすると、このメソッドを呼び出そうとするとどうなりますか?あなたのコメントに関しては

IParams params = (IParams) new HashMap<String,String>(); 

// What's supposed to happen here? HashMap doesn't have someMethod. 
params.someMethod(); 

意図がジェネリックを隠すインターフェイスを作成するために、また、(例には示されていない)を保持するマップであるキー文字列の定義

IParamsを実装し、HashMapを実装するクラスを作成することができます。

public class Params extends HashMap<String, String> implements IParams { 
    // ... 
} 

IParams params = new Params(); 
+1

幻想的な説明、私は兄弟の面で考えていませんでした。私はHashMapの実装を直接使用することができず、素早く具体的なクラスを作成する提案は非常に妥当です。 Jesperに感謝します。 –

3

HashMapMapインタフェースを実装しますが、それは、あなたが相続を誤解しているあなたはジェネリックを誤解されていませんIParams

関連する問題