我正在将值放入形式的哈希图中,
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);
}