我想定义一个静态Map的ArrayList,以包含一对[key,ArrayList object]的。
在这些时间段中有很多要添加的东西,但它们在每次执行时都是固定的。因此,在定义arrayList 的映射时,最好的方法是初始化。
我可以通过静态方法执行此操作,包括:
arrayList.add("value1"),
arrayList.add("value2"),
arrayList.add("value3"),
...
然后:
map.put("key", arrayList)
然而,对于每对[key,ArrayList],这些必须重复。
我尝试了 ImmutableMap ,但收到了此错误:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
at bugTriaging.Constants.<clinit>(Constants.java:11)
这是我的代码:
package package1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.google.common.collect.ImmutableMap;
public class Constants {
static final Map<String, ArrayList<String>> map1 = ImmutableMap.<String, ArrayList<String>>builder()
.put("key1", (ArrayList<String>) Arrays.asList("value1", "value2", "value3"))
.put("key2", (ArrayList<String>) Arrays.asList("value4", "value5", "value6", "value7"))
.put("key3", (ArrayList<String>) Arrays.asList("value8", "value9", "value10", "value11", "value12", "value13"))
.build();
public static void main(String[] args) {
System.out.println("Started ...");
}
}
我玩过静态和最终值,但无法运行它。
最后,我可以运行此代码:
@SuppressWarnings("serial") //to avoid the warning.
public static HashMap<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>() {{
put("key1", new ArrayList<String>() {{
add("value1");
add("value2");
}});
put("key2", new ArrayList<String>() {{
add("value3");
add("value4");
add("value5");
}});
put("key3", new ArrayList<String>() {{
add("value6");
add("value7");
add("value8");
}});
}};
以下是我的问题:
1-我的第一种方法中ImmutableMap的问题是什么?
2-使用我的解决方案,我收到警告(“可序列化类不会声明类型为long的静态最终serialVersionUID字段”)。添加 @SuppressWarnings(“serial”)正确摆脱警告的方式还是有更好的方法?
答案 0 :(得分:4)
改变 -
static final Map<String, ArrayList<String>> map1 = ImmutableMap.<String, ArrayList<String>>builder()
到
static final Map<String, List<String>> map1 = ImmutableMap.<String, List<String>>builder()
为什么?
Arrays.asList()
会返回不同的ArrayList
而不是java.util.List
。返回的ArrayList是Arrays
类中的静态内部类。
完成初始化:
static final Map<String, List<String>> map1 = ImmutableMap
.<String, List<String>> builder()
.put("key1", Arrays.asList(new String[] { "value1", "value2", "value3" }))
.put("key2", Arrays.asList(new String[] { "value4", "value5", "value6", "value7" }))
.put("key3",Arrays.asList(new String[] { "value8", "value9", "value10", "value11", "value12", "value13" })).build();
答案 1 :(得分:2)
ClassCastException来自第11行,您将返回的对象从Arrays.asList()转换为ArrayList。问题是Arrays.asList()返回List类型的对象(参见http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html),而List不是ArrayList的子类型。因此,要解决此问题,您可以将Map中存储的值更改为List,也可以手动构建ArrayLists,而不是使用Arrays.asList()。
如果您没有序列化任何内容,那就没关系。请参阅What does it mean: The serializable class does not declare a static final serialVersionUID field?。
我怀疑你使用ImmutableMap的方式存在另一个问题,但我不明白你的问题所以我不能对此发表评论。你能改写一下你的问题吗?