3

私の目的は、キーがクラスインスタンスであり、値が対応するクラスのインスタンスであるマップを作成することです。意味、

マップ(階層内の特定のクラス->対応するインスタンス)

そのために、私はMapを次のように宣言しました

Map<Class<? extends BaseService>, ? extends BaseService> serviceMap = 
    new HashMap<Class<? extends BaseService>, BaseService>();
//Assume BaseService is at the root of hierarchy.

上記はコンパイルされます。

マップにデータを入力するために、私は

public <T extends BaseService> void register(T service) {   
    serviceMap.put(service.getClass(), service);    
}

これはコンパイルされません。

これを機能させるにはどうすればよいですか?そして、なぜこれはコンパイルされないのですか?

4

1 に答える 1

5

ワイルドカードの使用は、英語の定義と完全に一致していません。定義する場合:

Map<Class<? extends BaseService>, ? extends BaseService> serviceMap;

serviceMapこれは、「を拡張するクラスからBaseServiceあるタイプの値 (BaseServiceまたはサブクラス)へのマップである」と説明される場合があります。

registerコンパイラは、このコンテキストでメソッド を拒否するのが正しいです。serviceMapの値の型は単に「何か」であると宣言されているため、値の型を使用してマップを簡単に割り当てることができますServiceImplOne。また、 register メソッドは class の引数で呼び出すことができますServiceImplTwo。これは汎用パラメータと一致しないため、マップに挿入できません!

任意のタイプのサービスを挿入できるようにする必要があるため、マップは BaseService の一部の(不明な) サブタイプではなく、すべてのインスタンスをBaseService値として受け入れる必要があることは明らかです。したがって、具体的な値の型でマップを宣言することでこれを修正できます。

Map<Class<? extends BaseService>, BaseService> serviceMap;
于 2012-07-30T11:04:15.533 に答える