2

可以转换ConcurrentHashMapHashMapjava吗?

这是我转换为的示例程序,ConcurrentHashMapHashMap出现以下异常:

线程“主”java.lang.ClassCastException 中的异常:java.util.concurrent.ConcurrentHashMap 无法在 com.Hi.main(Hi.java:18) 处转换​​为 java.util.HashMap

我的代码:

package com;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class Hi {

    public static void main(String args[]) {

        Map<String, String> conpage = new ConcurrentHashMap<String, String>();

        conpage.put("1", "A");
        conpage.put("2", "B");
        conpage.put("3", "C");

        HashMap hm = (HashMap) conpage;

        System.out.println(hm.get("1"));

    }

}
4

8 回答 8

12
Map<String, String> hashMap = new HashMap<String, String>(conpage);

A ConcurrentMap(like ConcurrentHashMap) 与 any 没有关系AbstractMap,例如 has HashMap,因此解决方案是创建一个新的HashMap添加ConcurrentHashMap对象创建期间的所有值。

希望这可以帮助。

于 2013-07-23T09:28:12.540 回答
5

ConcurrentHashMap不是HashMap,因此您无法执行此转换。无论实现如何,都将它们视为Map 。

不过,您可以使用Map#putAll()

推荐阅读:

  1. Java - HashMap 与 Map 对象
  2. “编程到接口”是什么意思?
于 2013-07-23T09:27:55.127 回答
3

使用putAll()方法而不是像这样的类型转换:

HashMap hm=new HashMap<String, String>();
hm.putAll(conpage);    
于 2013-07-23T09:30:21.337 回答
2

ConcurrentHashMap 和 HashMap 是兄弟,与父子无关。因此演员阵容失败。

于 2013-07-23T09:27:30.933 回答
1

为了更明确地解释前面的评论:考虑你有三个类:

class Position {
}

class One extends Position {
  String gold = "the best";
}

class Two extends Position {
  String silver = "just wait next year!";
}

您不能进行以下强制转换(请注意,强制转换不是转换:它只是类型的重新声明)

void showPosition() {
  Position one = new One(); // this is regular since One extends Position
  Two two = (Two)one; // this is impossible because one is not a two
}

如果这种转换是可能的,您希望编译器如何处理以下问题?:没有一个叫银的领域:所以叫

((Two)one).silver

是不可能的:返回 null 将是不安全的,因为您不会理解发生了什么:因为您知道字段 'silver' 已初始化为值“只需等待明年!”

Java 是一种安全的语言,它不允许这种类型的错误(实际上,它抛出异常是 Java 的帮助,因为您认为该类型是其他类型)。

您期望的行为是适合脚本的行为。

于 2013-07-23T11:25:15.410 回答
1

您可以通过以下方式执行此操作 -

HashMap<String, String> map = new HashMap<String, String>(conpage);

Java 文档

通常,Java Collection API 中的每个具体类型(如 HashMap、ArrayList 等)都有一个构造函数,该构造函数获取其父级(如 Map、List)的引用并从中构造一个新对象。

关于您得到的异常,这是因为ConcurrentHashMap不是 的子类型/超类型HashMap,因此您得到的是ClassCastException. 但是,这本来可以正常工作-

Map<String, String> hm = (Map<String, String> ) conpage;
于 2013-07-23T09:30:11.040 回答
1

ConcurrentHashMap 仍然是一个 Map。所以你可以像这样创建一个新的 TreeMap:

ConcurrentHashMap myMap;
...
TreeMap myTreeMap = new TreeMap( myMap );
于 2013-07-23T09:27:46.553 回答
0

实际上 HashMap 和 ConcurrentHashMap 之间没有继承关系,这就是为什么在将 concurrenthashmap 对象转换为 hashmap 时会给出 ClassCastException 的原因。

于 2013-07-23T10:24:23.647 回答