5

これはおそらく私の側の単純な誤解です。

シンプルなインターフェースを用意します。

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

この場合、ジェネリックに関する私の誤解がどこにあるかについての洞察はありますか?

4

2 に答える 2

10

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

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

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

もちろん、にsomeMethodは存在しませんHashMap。toをキャストするHashMapことIParamsが機能する場合、メソッドを呼び出そうとするとどうなると思いますか?

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();
于 2012-06-28T14:25:08.630 に答える
3

HashMap実装されたインターフェースですが、から派生したインターフェースであっても、Mapインターフェースを実装していません。これは、のタイプではないため、にキャストすることはできません。IParamsMapIParamsIParams

于 2012-06-28T14:26:02.293 に答える