Java 如何添加到HashMap中的强制列表中?

Java 如何添加到HashMap中的强制列表中?,java,casting,mutate,Java,Casting,Mutate,我有一个映射,其中一个值是列表。目前,我有: if (!data.containsKey(myVar)) { List<String> emp = new ArrayList(); data.put(myVar, emp); // myVar is a String } else { data.get(myVar).add(otherVar); // "add" gives an error; otherVar is a String } if(!data.contai

我有一个
映射
,其中一个值是
列表
。目前,我有:

if (!data.containsKey(myVar)) {
  List<String> emp = new ArrayList();
  data.put(myVar, emp); // myVar is a String
} else {
  data.get(myVar).add(otherVar); // "add" gives an error; otherVar is a String
}
if(!data.containsKey(myVar)){
List emp=new ArrayList();
data.put(myVar,emp);//myVar是字符串
}否则{
data.get(myVar).add(otherVar);/“add”给出一个错误;otherVar是一个字符串
}
我目前的解决办法是

} else {
  @SuppressWarnings("unchecked")
  List<String> vals = (List<String>) data.get(myVar);
  vals.add(otherVar);
  data.put(myVar, vals);
}
}其他{
@抑制警告(“未选中”)
List vals=(List)data.get(myVar);
VAL.add(其他变量);
数据投入(myVar、VAL);
}

有更好的解决方案吗?

除非您可以将
Map
更改为
Map
,否则没有更好的解决方案。你需要一个演员。当然,您可以添加
instanceof
检查并将其提取到助手方法中,但最终需要强制转换

但是有一件事:你不需要再做另一件
put
到映射中-
vals.add(otherVar)
修改映射中已经存在的
List
,它不会返回新的List实例


关于一行代码(强制转换到
列表
并在同一行中执行
添加
)-这不是很好,因为您要么必须容忍“unchecked cast”编译器警告,要么必须将
@SuppressWarnings(“unchecked”)
放在方法级别,这可能会在方法中抑制此类型的其他警告


编辑

映射的值为字符串或列表

在此情况下,您可以考虑将数据结构更改为<代码> MAP。由单个元素组成的列表完全有效:)

然后代码变得非常简单。在Java 8中,它是一个单行程序:

data.computeIfAbsent(myVar, key -> new ArrayList<>()).add(otherVar);
data.computeIfAbsent(myVar,key->newArrayList()).add(otherVar);

什么是myvar、othervar、mykey?“其中一个值是列表”:其他值的类型是什么?简而言之:
((List)data.get(myvar)).add(othervar)
put的较短方式:
data.put(myVar,newarraylist())更好的方法:重新考虑拥有不同值类型的
映射。