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

why HashMap Values are not cast in List?(为什么 HashMap 值不在 List 中转换?)
本文介绍了为什么 HashMap 值不在 List 中转换?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm putting values into the hashmap which is of the form,

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

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

I want to create a list by using values() method of 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

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

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

But it allows me to pass it in to the creation of a list:

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

推荐答案

TL;DR

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

说明

因为 HashMap#values() 返回一个 java.util.Collection 并且您不能将 Collection 转换为ArrayList,因此你得到 ClassCastException.

Explanation

Because HashMap#values() returns a java.util.Collection<V> and you can't cast a Collection into an ArrayList, thus you get ClassCastException.

我建议使用 ArrayList(Collection<? extends V>) 构造函数.这个构造函数接受一个实现 Collection<? 的对象.扩展 V> 作为参数.当您像这样传递 HashMap.values() 的结果时,您不会得到 ClassCastException:

I'd suggest using ArrayList(Collection<? extends V>) constructor. This constructor accepts an object which implements Collection<? extends V> as an argument. You won't get ClassCastException when you pass the result of HashMap.values() like this:

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

深入了解 Java API 源代码

HashMap#values():检查源代码中的返回类型,并问自己,java.util.Collection是否可以强制转换为java.util.ArrayList?没有

Going further into the Java API source code

HashMap#values(): Check the return type in the source, and ask yourself, can a java.util.Collection be casted into java.util.ArrayList? No

public Collection<V> values() {
    Collection<V> vs = values;
    return (vs != null ? vs : (values = new Values()));
}

ArrayList(Collection):检查源中的参数类型.参数是超类型的方法可以接受子类型吗?是的

ArrayList(Collection): Check the argument type in the source. Can a method which argument is a super type accepts sub type? Yes

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 值不在 List 中转换?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How can create a producer using Spring Cloud Kafka Stream 3.1(如何使用Spring Cloud Kafka Stream 3.1创建制片人)
Insert a position in a linked list Java(在链接列表中插入位置Java)
Did I write this constructor properly?(我是否正确地编写了这个构造函数?)
Head value set to null but tail value still gets displayed(Head值设置为空,但仍显示Tail值)
printing nodes from a singly-linked list(打印单链接列表中的节点)
Control namespace prefixes in web services?(控制Web服务中的命名空间前缀?)