因为项目中需要获取到Map的值的集合,所以调用了HashMap.values()方法转成List,当时是使用了以下代码。(逻辑上这样想应该没问题,但生活总是会是不是给你一点小“”惊喜“”)
List<AreaItemOpt> areaItemOpts = (List<AreaItemOpt>) areaItemOptMap.values();
return areaItemOpts;
怀着喜悦的心情在测试环境中运行之后,它报错了!报错如下:
java.lang.ClassCastException: java.util.HashMap$Values cannot be cast to java.util.List
错误原因:
于是翻了一下values()方法的源码
public Collection<V> values() {Collection<V> vs = values;return (vs != null ? vs : (values = new Values()));}
原来values()方法只是返回了一个Collection集合,可是如程序中的用法所示,在向下转型的时候出现了类型转换错误。
解决方法:
在ArrayList中,有一个构造函数
public ArrayList(Collection<? extends E> c) {elementData = c.toArray();if ((size = elementData.length) != 0) {// c.toArray might (incorrectly) not return Object[] (see 6260652)if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);} else {// replace with empty array.this.elementData = EMPTY_ELEMENTDATA;}}
可以接受一个集合类型的参数,然后返回一个list;这样就达到了预期目的。代码如下:
List<AreaItemOpt> areaItemOpts = new ArrayList<>(areaItemOptMap.values());
return areaItemOpts;
测试通过~
发现还有一种方法也可以解决这个问题:
List<T> list=(List<T>) Arrays.asList(map.values().toArray());//先转数组再转list