TL; DR
List<V> al = new ArrayList<V>(hashMapVar.values());
说明
因为
HashMap#values()返回a
java.util.Collection<V>,而不能将a
Collection转换为an
ArrayList,所以得到
ClassCastException。
我建议使用
ArrayList(Collection<? extends V>)构造函数。此构造函数接受一个实现
Collection<? extendsV>为参数的对象。
ClassCastException通过这样的结果,您将不会得到
HashMap.values():
List<V> al = new ArrayList<V>(hashMapVar.values());
进一步研究Java API源代码
HashMap#values(): 检查源代码中的返回类型,并问自己,是否可以将a
java.util.Collection强制转换为
java.util.ArrayList?没有
public Collection<V> values() { Collection<V> vs = values; return (vs != null ? vs : (values = new Values()));}ArrayList(Collection): 检查源中的参数类型。哪个参数是父类型的方法可以接受子类型吗?是
public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class);}


