0
public class People {
    class Family extends People {
    }
}

public class Together {
    private static ConcurrentMap<String, Collection<Family>> familyMap= new ConcurrentHashMap<String, Collection<Family>>();
    private static ConcurrentMap<String, ConcurrentMap<String, Collection<People>>> registry2 = new ConcurrentHashMap<String, ConcurrentMap<String, Collection<People>>>();

    static {
        registry2.put(Family.class.toString(), familyMap); 
    }
}

(私はすでに宣言registry2をhavingに変更しようとしました? extends People

エラーは次のとおりです。 The method put(String, ConcurrentMap<String,Collection<People>>) in the type Map<String,ConcurrentMap<String,Collection<People>>> is not applicable for the arguments (String, ConcurrentMap<String,Collection<Family>>)

どうすればハッシュマップにfamilyMap入れることができますか?registry2

4

2 に答える 2

3

これは Map の問題ではありません。これは Generics の問題です。a がbecauseCollection<Family>のサブクラスであると想定していますが、そうではありません。Collection<People>Family extends People

実際、それらはまったく異なる型であるため、コンパイラは、正しい型の引数を渡していないと文句を言います。


この問題は、familyMap を People オブジェクトのコレクションを保持する Map にすることで解決できます。Family は People であるため、コードはたまたま Family オブジェクトをその中に入れていますが、これは問題ありません。

ただし、Family オブジェクトをマップから戻す場合、特定の Family 関数を使用する必要がある場合は、それらを Family に型キャストする必要があります。それに。そのリスクを軽減するために、別の設計パラダイムを検討することをお勧めします。

于 2013-06-19T21:00:48.230 に答える
0

( )で指定したfamilyMapは であり、Collection<Family>ではないため、互換性のない型を入れようとしていますCollection<People>registry2ConcurrentMap<String, Collection<People>>

于 2013-06-19T21:01:55.580 に答える