3

親を持つオブジェクト モデルがあり、ここでは MyParent.java と呼びます。このクラスには、MySub1.java と MySub2.java という名前の 2 つのサブクラスがあります。

1 つは MySub1 インスタンスを含み、もう 1 つは MySub2 インスタンスを含みます。両方の HashMap を処理でき、まったく同じことを実行できるコードを実行しようとしています (後で、MySub1 または MySub2 インスタンスを使用すると何らかの効果がありますが、ここでは効果がありません)。

コンパイルするコードの一部を次に示します。

HashMap<String, ? extends MyParent> map = null;
if (some condition)
    map = // get a HashMap<String, MySub1>
if (some other condition)
    map = // get a HashMap<String, MySub2>

mapしかし今、変数を反復処理する方法がわかりません。keySet()ハッシュマップからいくつかの要素を削除する必要があるため、要素の反復ではなく、イテレータを介してそれを行う必要があります。

コンパイルされないコードの一部は次のとおりです。

if(map != null && map.size() > 0){
    Iterator<Entry<String, ? extends MyParent>> i = map.entrySet().iterator();
    while(i.hasNext()){
        Map.Entry<String, MyParent> pair = (Map.Entry<String, MyParent>) i.next();
        // get the object from the pair and handle it
    }
}

Eclipse は、イテレータを作成する行に次のエラー メッセージを表示します。

 cannot convert from Iterator<Map.Entry<String,capture#5-of ? extends MyParent>> to Iterator<Map.Entry<String,? extends MyParent>>

エラーメッセージが本当にわかりません。のコードの最初の行を変更すると:

HashMap<String, MyParent> map = null

機能していなかったコードは機能するようになりましたが、機能しているコードは次のエラー メッセージで機能しなくなりました。

cannot convert from HashMap<String,MySub1> to HashMap<String,MyParent>

何か案が ?

4

2 に答える 2

3

String と MyParent のインスタンスのペアをいつでも に入れることができますMap<String,MyParent>。そのペアを に入れることはできませんMap<String,MySub1>。したがって、後者から前者のマップへの変換は不可能です (最後のエラー メッセージが示すように)。共分散と反分散に関するウィキペディアも参照してください。

同じ問題のバージョンが反復子に適用されます。実際のマップが の場合、 aが であってもに変換できないMap<String,MySub1>返します。たとえば、次のようにコンパイルされます。Iterator<Map.Entry<String,MySub1>>Iterator<Map.Entry<String,? extends MyParent>>Map.Entry<String,MySub1>Map.Entry<String,? extends MyParent>

Map.Entry<String,? extends MyParent> someEntry = map.entrySet().iterator().next();.

別のワイルドカード ( ?) がここで役立ちます。

Iterator<? extends Map.Entry<String, ? extends MyParent>> i =  map.entrySet().iterator();
于 2013-02-21T08:04:43.023 に答える
0

正確な要件はわかりませんが、同じマップに複数のオブジェクト タイプがあると、深刻なメンテナンスの問題が発生する可能性があります。次のシナリオについて考えていただければ幸いです

  1. ある時点で両方の条件が満たされたとき

  2. Mysub1/Mysub2 の動作が変化したとき。

  3. 他の誰かがコードを保守しているとき。

    別のインスタンスを使用することをお勧めします。複数のマップをどこにでも持ち歩かないようにするために、それらをオブジェクトにラップすることができます。

于 2013-02-21T08:24:21.657 に答える