Java 如何安全地从地图检索ArrayList<;字符串,对象>;
如何从存储的键值为ArrayList的映射中安全地检索ArrayList对象。下面是我的代码。除了向ArrayList投稿,还有其他方法吗Java 如何安全地从地图检索ArrayList<;字符串,对象>;,java,generics,Java,Generics,如何从存储的键值为ArrayList的映射中安全地检索ArrayList对象。下面是我的代码。除了向ArrayList投稿,还有其他方法吗 public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); Map<String, Object> map = new Has
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("A"); list.add("B");
Map<String, Object> map = new HashMap<String, Object>();
map.put("list", list);
System.out.println(map.get("list").getClass()); // class java.util.ArrayList
List<String> l = (ArrayList<String>)map.get("list");
}
publicstaticvoidmain(字符串[]args){
列表=新的ArrayList();
列表。添加(“A”);列表。添加(“B”);
Map Map=newhashmap();
地图放置(“列表”,列表);
System.out.println(map.get(“list”).getClass();//class java.util.ArrayList
List l=(ArrayList)map.get(“List”);
}
我正在使用来自Jackson
的@JsonAnySetter
来存储地图。当我检查类时,它们是类java。util.ArrayList
。(与问题中解释的情况完全相同)
在尝试了几件事之后,我终于得到了它。我知道我有点晚了,但希望这会对将来的人有所帮助:
我有映射
对象
正在存储另一个映射
,字符串
,或者数组列表
,所以我做了以下事情从映射
中获取值。您可以将其用作参考,并根据所需类型执行不同的操作
public void marshal(Map<String, Object> extensions) {
for (Map.Entry<String, Object> property : extensions.entrySet()) {
if (property.getValue() instanceof ArrayList) {
for (Object dupItems : (ArrayList<String>) property.getValue()) {
if (dupItems instanceof Map) {
//do whatever you want to do Map type
} else if(dupItems instanceof String) {
//do whatever you want to do for String type
}
}
}
}
}
公共无效封送处理(映射扩展){
for(Map.Entry属性:extensions.entrySet()){
if(property.getValue()instanceof ArrayList){
对于(对象dupItems:(ArrayList)属性。getValue(){
if(映射的dupItems实例){
//做任何你想做的事地图类型
}else if(字符串的dupItems实例){
//对字符串类型执行任何操作
}
}
}
}
}
不要在存储对象的地图中存储arraylist。相反,请告诉地图存储ArrayList(或列表)。不要丢弃您仍然需要的类型信息。这表明您的体系结构不好,应该重新设计,而不是试图使强制转换安全。@Zabuza给了您很好的建议。Map
是您可以做的事情。此外,您可以使用instanceof
来检查强制转换是否安全。但正如前面所说,这种需求通常意味着糟糕的设计。如果你坚持使用Map
,除了铸造,你别无选择