質問

私は、次のインタフェースを持っているコンテナのマップの種類を作りたいです

public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);

は興味深い点は、各TClass<T>sことである - > Thing<T>ペアは同じTであるが、容器は、ペアの多くの異なる種類を保持することができなければなりません。当初、私は(ハッシュ)地図してみました。しかし、例えば、

Map<Class<T>, Thing<T>>
その後、Tはそのマップで、のすべてののペアで同じTになるので

は、右ではありません。もちろん、

Map<Class<?>, Thing<?>>

作品が、その後私はget(String.class)とき、私は必ず私がThing<String>インスタンスを取り戻すことをできないように型の安全性の保証はありません。

私が探していることを型の安全性の種類を達成する明白な方法はありますか?

役に立ちましたか?

解決

マップ自体がそれを保証しませんが、あなただけ上記の方法でそれにアクセスしている場合、あなたが希望安全性を持つことになります。

他のヒント

あなたは2型パラメータを宣言するべきではないさまざまな種類を置くことができるようにしたい場合は?

public <K, V> Thing<V> get(Class<K> clazz);
public <K, V> void put(Class<K> clazz, Thing<V> thing);

または私は質問を誤解したのですか?

編集:私はあなたが、異なる種類のエンティティを保持することができ、コンテナoをしたい場合は、あなたのコンテナを宣言するときにのみ、コンテナの上に一種類を置くことができるので、あなたは完全な型の安全性を持つことができる方法は、ありませんだけでなく、見た後、あなた内のオブジェクトを置くことができるかもしれないが、あなたが戻って何を得ることを確認することはできません。せいぜい、あなたが戻ってそれらを取得するときに、オブジェクトなどのオブジェクトを入れ、その後、instanceofはやってキャストなってしまいます。すべてのコレクションは、この問題を抱えています。あなたはCollection<T extends Thing>を持っている想像してみてください。あなたはそれ物事、ChildOfThings、またはGrandChildOfThingsに入れるかもしれないが、あなたはそれを取り戻すとき、あなたはしている唯一の保証は、それが実際にそれをテストすることなく、子供や孫だ場合、あなたが言うことができない事だということです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top