我正在将值放入形式的哈希图中,

Map<Long, Double> highLowValueMap=new HashMap<Long, Double>();
highLowValueMap.put(1l, 10.0);
highLowValueMap.put(2l, 20.0);

我想通过使用 map 的values()方法创建一个列表。
List<Double> valuesToMatch=new ArrayList<>();
valuesToMatch=(List<Double>) highLowValueMap.values();

要么
List<Double> valuesToMatch=(List<Double>) highLowValueMap.values();

但是,它将引发异常:



但是它允许我将其传递给列表的创建:
List<Double> valuesToMatch  = new ArrayList<Double>( highLowValueMap.values());

最佳答案

TL; DR

List<V> al = new ArrayList<V>(hashMapVar.values());

说明

因为HashMap#values()返回java.util.Collection<V>,并且您不能将Collection转换为ArrayList,所以您得到ClassCastException

我建议使用ArrayList(Collection<? extends V>)构造函数。该构造函数接受一个将Collection<? extends V>实现为参数的对象。这样传递ClassCastException的结果时,您不会得到HashMap.values():
List<V> al = new ArrayList<V>(hashMapVar.values());

进一步研究Java API源代码

HashMap#values():检查源中的返回类型,并问自己,是否可以将java.util.Collection转换为java.util.ArrayList?没有
public Collection<V> values() {
    Collection<V> vs = values;
    return (vs != null ? vs : (values = new Values()));
}

ArrayList(Collection):检查源中的参数类型。 super 参数类型的方法可以接受子类型吗?是
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);
}

10-07 19:09
查看更多