1

マップを作成しようとしていますが、その値はクラスの人物、動物、または文字列のリストにすることができ、最後にそれを読んでいます。

次の質問があります。

Map<String,List<? extends Object>> someDataMap = 
new LinkedHashMap<String,List<? extends Object>>();

Person p = new Person();
Animals a = new Animals();

List<Person> personList  = p.getPersonList();
List<Animals> animalsList  = a.getAnimalsList();


List<String> someStrings = new ArrayList<String>();

someStrings.add("Employe123");
someStrings.add("Pet-Cat");


// putting lists into map
someDataMap.put("person",personList);
someDataMap.put("animals",animalsList);
someDataMap.put("listsOfData",someStrings);



// now reading the values.


   Map<String,List<? extends Object>> datMap  = 
   (Map<String,List<? extends Object>>)model.get("datMap");

List<Person> dataList = (List<Person>) datMap.get("person");

List<Animals> nodalList = (List<Animals>)datMap.get("animals");

List<String> listsOfData = (List<String>) datMap.get("listsOfData");
  1. このアプローチは正しいですか、私はこれらの値を入れて読むことを意味します。
  2. パラメータなしでマップを使用しないのはなぜですか、ジェネリックとワイルドカード付きのジェネリックを使用するのはなぜですか、私はそれについて読みましたが、まだ明確ではありません

ポジョなしでこのアプローチを試してみたいと思います。またはpojoが必要ですか。

助けてください、あなたの助けはありがたいです。

ありがとう

4

2 に答える 2

2

ジェネリックを使用する場合、リストから読み取ったオブジェクトを明示的にキャストする必要はありません

と仮定するとMap<String, Animal> map...map.get("someKey");が返されAnimalます。

より複雑な例のいくつかでも同じことが言えます。

Mapさまざまなタイプのオブジェクトをsに入れると、問題が発生します。Map;ではなく POJO が必要なようです。

class Stuff {

  private List<Person> people;
  private List<Animal> animals;
  private List<String> data;

 // Getters and setters

}

これはよりクリーンになり、あなたの質問について私が理解していることから、あなたのニーズに合っているようです。この場合のニーズに合わないと思われるStuffの代わりに渡すだけです。Map

于 2012-08-11T05:38:44.193 に答える
0

キャストは安全ではないため、このアプローチは適切ではありません。へのキャストList<Person>は、リスト内のすべての項目がタイプであるかどうかをチェックしませんPersonClassCastExceptionではない要素を取得しようとすると、が返されますPerson

1) 本当にこれらのリストを に入れる必要があるかどうかを検討する必要がありますMap。2) もしそうなら、マップからリストを取得した後にリストをコピーすることができます (リストが巨大でない場合):

List<Person> dataList = new ArrayList<Person>(datMap.get("person"));

しかしもちろん、リストへの更新はソースリストでは行われません。

于 2012-08-12T10:58:52.800 に答える