当前位置: 首页 > 知识库问答 >
问题:

为什么不在列表中强制转换HashMap值?

傅阳炎
2023-03-14

我将值放入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();

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

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

共有1个答案

蒋文光
2023-03-14
List<V> al = new ArrayList<V>(hashMapVar.values());

因为hashmap#values()返回java.util.collection ,而您不能将collection转换为ArrayList,因此您将获得ClassCastException

我建议使用ArrayList(collection )构造函数。此构造函数接受实现集合<?将v>扩展为参数。当您像这样传递hashmap.values()的结果时,您不会得到ClassCastException:

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

hashmap#values():检查源代码中的返回类型,并问问自己,java.util.Collection是否可以将java.util.ArrayList强制转换为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);
}

 类似资料:
  • 问题内容: 我正在将值放入形式的哈希图中, 我想使用map方法创建一个列表。 要么 但是,它将引发异常: 线程“主”中的异常java.lang.ClassCastException: java.util.HashMap $ Values无法转换为java.util.List 但是它允许我将其传递给列表的创建: 问题答案: 说明 因为返回a ,而不能将a 转换为an ,所以得到。 我建议使用构造函数

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 问题内容: 执行此强制转换时出现编译错误: 应该被继承,尽管不能直接继承。 从文档: 农具其中inturn & 为什么这无效? 也感谢您提供有关使用as 的正确方法的意见? 我正在考虑包装方法。 问题答案: 扩展,并且 不 扩展。 如果您想从中获得帮助,我认为实现包装器类是您最简单的选择。幸运的是的唯一抽象方法是。 RandomAccessFile实现了DataInput,该数据输入将依次转为Da

  • 我还没有看到这个问题,这让我很惊讶。 以下内容不会编译: 然而,将此更改为强制转换对象并将其引用存储在条件语句之外的新对象中,可以解决此问题: 我的问题是,为什么Java中不允许这种行为?(特别是Java 5) 编辑:啊哈!谢谢大家。该死的现代IDE给出了模糊的错误消息。我已经开始打折了,这一次对我没有任何好处。(Netbeans警告我缺少括号和分号…)

  • 问题内容: 我想知道为什么Java不允许将布尔值转换为整数,如下所示: 例如,这可以用一行代码来完成, 但似乎更好和更容易阅读的方法是允许类型转换,如和一样。Java为什么不包括此功能? 问题答案: 不允许这样做是因为Java设计人员(正确地)认识到C和C ++中的布尔/整数重载是错误的重要来源。 (我记得曾经写过一些设计原理的书,但我找不到。) 例如: 是合法的,但可能是用C或C ++编写的应用

  • 问题内容: 我有一个简单的类,并且可以强制转换为集合接口(或),而不会出现任何编译器错误。请注意,该类不实现任何接口或扩展任何其他类。 当我尝试将类转换为集合时,为什么Java编译器不返回 不兼容类型错误? 没有实现。我预计会出现不兼容的类型错误,因为给定当前的类签名,所以不能是。 问题答案: 不是因为它们是集合类,而是因为它们是 接口 。没有实现它们,但是可以实现它的子类。因此,这不是编译时错误