2013-07-23 3 views
1

java에서 ConcurrentHashMapHashMap으로 변환 할 수 있습니까?ConcurrentHashMap을 HashMap으로 변환

이 내가 HashMapConcurrentHashMap에서 변환 된 그러나 나는 다음과 같은 예외를 얻고 있었다 내 샘플 프로그램입니다 :

예외 스레드 "기본"java.lang.ClassCastException가에 : 있는 java.util.concurrent. ConcurrentHashMap의이 com.Hi.main에서 java.util.HashMap에 캐스트 할 수없는 (Hi.java:18)

내 코드 :

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")); 

    } 

} 

답변

3

ConcurrentHashMap 및 HashMap은 형제이며 Parent-Child 관련이 아닙니다. 따라서 캐스트가 실패합니다.

1

ConcurrentHashMap은 여전히 ​​Map입니다. 그래서 당신은이 같은 새로운 트리 맵을 생성 할 수 있습니다 :이 캐스트를 수행 할 수 있도록

ConcurrentHashMap myMap; 
... 
TreeMap myTreeMap = new TreeMap(myMap); 
10
Map<String, String> hashMap = new HashMap<String, String>(conpage); 

ConcurrentMap (ConcurrentHashMap 같은) 어떤 AbstractMap 아무 관계 예 HashMap이 있으므로 해결책이이 없다 만들다 객체 생성 중 ConcurrentHashMap의 모든 값을 새로 추가하는 HashMap

희망이 도움이됩니다.

1

다음과 같은 방법으로 수행 할 수 있습니다 -

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; 
3

사용 putAll() 방법 istead이 같은 :

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

사실에 ConcurrentHashMap의 개체를 캐스팅하면서 왜의 HashMap과 ConcurrentHashMap의 사이에 상속 관계가 없습니다 해시 맵은 ClassCastException을 제공합니다.

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 
} 

이 캐스트가 가능하다면 어떻게 컴파일러에서 다음 promblem을 처리하겠습니까? 그래서

((Two)one).silver 

를 호출하는 것은 불가능하다 : 하나 실버라는 더 필드가 없다 당신이 무슨 일이 일어나고 있는지 이해하지 못할 때문에 반환 null가 안전하지 않은 것 : 당신은 필드 '실버'가 초기화되는 것을 알고 있기 때문에 가치 "그냥 내년 기다려!"

Java는 안전한 언어이므로이 유형의 오류는 허용되지 않습니다. 실제로 Java가 Java에서 도움을 받으면 유형이 다른 것으로 생각하기 때문에 예외가 발생합니다.

당신이 기대하는 행동은 오히려 스크립트에 적합한 행동입니다.

관련 문제