当前位置: 首页 > 面试题库 >

为什么HashMap值不转换为List?

江衡
2023-03-14
问题内容

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

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

我想使用values()map方法创建一个列表。

List<Double> valuesToMatch=new ArrayList<>();
valuesToMatch=(List<Double>) highLowValueMap.values();

要么

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

但是,它将引发异常:

线程“主”中的异常java.lang.ClassCastException:
java.util.HashMap $ Values无法转换为java.util.List

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

List<Double> valuesToMatch  = new ArrayList<Double>( highLowValueMap.values());

问题答案:
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<? extends V>为参数的对象。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);
}


 类似资料:
  • 我将值放入hashmap中, 我想通过使用map的方法创建一个列表。 但它允许我将其传递给列表的创建:

  • 问题内容: 是的实现,并且的构造函数接收类型参数。那么,为什么必须对其进行显式转换? 问题答案: 这是因为extends(又实现了)。您尝试将其输入。因此,它是不兼容的。 您需要将字符串属性一一输入到地图中。 例如:

  • 问题内容: 我有arrayList 我想像这样转换为ArrayList到HashMap 请帮助我如何转换为HashMap。 问题答案: 一般的方法是遍历,然后将值插入。示例如下:

  • 问题内容: 嗨,我有一个csv叫做。我试图逐行读取csv并将值转换为哈希键值对。这是代码:- csv文件如下:- 当我运行此代码时,出现此错误:- 谁能帮助我修复代码并找出程序中的错误? 问题答案: 在字符串中,当你把它分解的第一次只包含如没有在这样就会导致异常 如果不需要1,2等。可以查看以下代码:

  • 问题内容: 我发现一些代码我工作的地方的点被强制转换,因为它是传递给方法。 为什么要这样做? 我知道这个问题涉及重载的方法,并使用类型转换来确定要调用的方法的版本。 但是,如果不执行强制类型转换,如果使用空参数调用该方法,那么是否会重选带有其他类型的参数的重载方法呢?那么演员阵容还能完成什么呢? 问题答案: 如果 未 执行转换,则将选择 最具体的 版本。 可以是type 或type 的空引用。因此

  • 问题内容: 我有一个子过程命令,输出一些字符,例如’\ xf1’。我正在尝试将其解码为utf8,但出现错误。 上面抛出: 当我使用’latin-1’时它可以工作,但是utf8也不能工作吗?我的理解是latin1是utf8的子集。 我在这里想念什么吗? 编辑: 问题答案: 您已经将Unicode与UTF-8混淆了。Latin-1是Unicode的子集,但不是UTF-8的子集。 避免像瘟疫一样思考各个