2

オブジェクトを拡張するオブジェクトの多数の配列リストを受け取りました。参照を高速化するために、それらをハッシュマップに挿入したいと考えています。コードの重複は頻繁に発生するため、コードの重複を避けるためのメソッドを作成することにしました。私が知っている方法はいくつかありますが、どれも非常にクリーンで美しいとは思えません。もっと簡単な解決策がないかどうか疑問に思っています。だからこういうのやりたい…

private void addToMap(Collections<? extends myObject> collection, Map<String, ? extends myObject> map){

  for(MyObject myObject: collection){
    map.put(myObject.getName(), myObject);
  }
}

メソッドのコントラクトでは、提供されるコレクションが map と同じクラスを格納する必要があります。メソッドが例外をスローしても、誰かがその契約を破り、myObject の別の実装を格納したコレクションと格納されたマップを 2 つ渡そうとしたとしても問題ありません。

型の安全性を促進するために "? extends MyObject" を期待するコレクションに 'myObject' を入れることができないため、上記のコードは失敗します。私はそれをキャストするだけで大​​丈夫ですが、それをキャストする方法を理解するために私が知っている唯一の方法は、醜い反射のいくつかのステップを含み、複雑に見えます. ある種の内部クラスを作成して、より強力なジェネリックを使用できるようにすることもできます (コレクションとマップに同じ型を強制的に格納するため)。

では、読者にとって最も直感的な方法でこのメソッドを作成するための簡単できれいな方法はありますか? ジェネリックを完全に捨てて、オブジェクトからすべてをキャストできることはわかっています。よりエレガントな方法を見つけようとしています。

4

2 に答える 2

3

次のものが必要なようです。

private <T extends MyObject> void addToMap(
        Collection<T> collection,
        Map<String, ? super T> map
) {
    for (T myObject : collection) {
        map.put(myObject.getName(), myObject);
    }
}

より詳しい情報:

于 2013-03-21T01:07:57.660 に答える
0

によると思います。

Genericsは、stong 型の転送と評価のためにクライアント コードとサービス コードが緊密に契約されているいくつかのシナリオに適した設計になっています。したがって、ジェネリックはこの場合、プリコンパイル時の安全性を提供するだけですが、クライアント コードが間違った型にばかげたキャストを行い、それらをジェネリック コレクションに入力する場合、完全に安全で便利というわけではありません私たちが知っているように、コレクションは実行時に崩壊しますが、コンパイル時には問題ありません。

ジェネリクス、ジェネリクス コレクションに追加するいくつかのオブジェクトが正しいことを私たち自身が保証できる場合には適していません。それらを 1 つのスーパークラスのストロング タイプに統合またはキャストすることはできません。この場合、生の型コレクションを使用するか、または のようなコレクションを使用して、ジェネリックを無視できます。それは正しい方法です。 私はあなたがおそらくこのケースにいると思いますList<Object>

于 2013-03-21T04:53:05.947 に答える