gpt4 book ai didi

java - 为什么 HashMap 值不在 List 中转换?

转载 作者:IT老高 更新时间:2023-10-28 13:51:34 26 4
gpt4 key购买 nike

我将值放入形式为的 HashMap 中,

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();

但是,它会引发异常:

Exception in thread "main" java.lang.ClassCastException:
java.util.HashMap$Values cannot be cast to java.util.List

但它允许我将其传递给创建列表:

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 class)型的方法可以接受子类型吗?是的

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);
}

关于java - 为什么 HashMap 值不在 List 中转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15522546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com