繁体   English   中英

将ConcurrentHashMap转换为HashMap

[英]Converting ConcurrentHashMap to HashMap

是否可以在Java中将ConcurrentHashMap转换为HashMap

这是我从ConcurrentHashMap转换为HashMap示例程序,但出现以下异常:

线程“主”中的异常java.lang.ClassCastException:无法在com.Hi.main(Hi.java:18)上将java.util.concurrent.ConcurrentHashMap强制转换为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"));

    }

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

ConcurrentMap (例如ConcurrentHashMap )与任何AbstractMap都没有关系,例如HashMap ,因此解决方案是创建一个新的HashMap并在对象创建过程中添加ConcurrentHashMap所有值。

希望这可以帮助。

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

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

建议阅读:

  1. Java-HashMap与Map对象
  2. “编程到接口”是什么意思?

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

HashMap hm=new HashMap<String, String>();
hm.putAll(conpage);    

ConcurrentHashMap和HashMap是兄弟姐妹,与父子不相关。 因此,转换失败。

ConcurrentHashMap仍然是Map。 因此,您可以像这样创建一个新的TreeMap:

ConcurrentHashMap myMap;
...
TreeMap myTreeMap = new TreeMap( myMap );

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

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

JavaDoc

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

关于您得到的异常,这是因为ConcurrentHashMap不是HashMap的子类型/超类型,因此您得到的是ClassCastException 但是,这本来很好-

Map<String, String> hm = (Map<String, String> ) conpage;

为了更清楚地解释前面的注释,请考虑以下三个类:

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
}

如果可以的话,您希望编译器如何处理以下问题? :一个字段中没有一个叫做Silver的字段:

((Two)one).silver

这是不可能的:返回null将是不安全的,因为您将不了解所发生的事情:因为您知道字段“ silver”已初始化为值“仅在明年等待!”

Java是一种安全的语言,它不允许这种类型的错误(实际上,这是Java的一种帮助,它会引发异常,因为您认为类型本身就是其他类型)。

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

实际上,HashMap和ConcurrentHashMap之间没有继承关系,这就是为什么在将钱币并发对象映射为hashClass时将其传递给ClassCastException的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM