2009-11-22 4 views
107

HashMap<String, int> 작동하지가 작동하지 않고 HashMap<String, Integer>이 작업을 수행합니다. 이유가 무엇입니까?자바 : HashMap의 <String, int>

+0

질문에 대한 단어 선택이 혼란 스럽습니까? 명확히 할 수 있습니까? 정확히 작동하지 않는 코드는 게시 할 수 있습니까? –

+7

@aforloney - 이것은 컴파일 오류입니다. –

답변

171

Java에서 기본 유형으로 원시 유형을 사용할 수 없습니다. 대신 사용하여 코드에 약간의 차이가 auto-boxing/unboxing

Map<String, Integer> myMap = new HashMap<String, Integer>(); 

. 자동 복싱은 당신이 쓸 수있는 의미 대신

myMap.put("foo", 3); 

을 :

myMap.put("foo", new Integer(3)); 

자동 권투는 첫 번째 버전은 암시 적으로 두 번째로 변환을 의미합니다.

int i = myMap.get("foo"); 

대신 : 자동 언 박싱 당신이 쓸 수있는 의미

int i = myMap.get("foo").intValue(); 

intValue()에 대한 암시 적 호출은 의미 키는 예를 들어,이 NullPointerException 생성 발견되지 않는 경우 :

int i = myMap.get("bar"); // NullPointerException 

이유는 type erasure입니다. 말하자면 C#에서는 제네릭 형식이 런타임에 유지되지 않습니다. 그들은 명시 적으로 캐스팅 단지 "문법 설탕"당신이이 일에 저장하기 :

Map<String, Integer> myMap = new HashMap<String, Integer>(); 
Map<Integer, String> map2 = (Map<Integer, String>)myMap; 
map2.put(3, "foo"); 
+3

마지막 예제가 작동하지 않습니다. Map 에서 Map 으로 캐스팅 할 수 없습니다. – T3rm1

+0

Float 및 Double에서 작동하지 않는 이유는 무엇입니까? –

+0

새 행의 각 개별 코드를 고려할 때 get() 메서드를 사용할 때 객체로 간주되므로 intValue() 메서드를 사용하기 전에 먼저 5 행의 코드를 Integer로 형변환해야합니다. –

-2

당신은 일반적인 인수, 원시적 형태가 아닌에서 참조 유형을 사용할 수 있습니다. 그래서 여기 당신은 HashMap의 기본 형식을 사용할 수 없습니다

myMap.put("abc", 5); 
+1

이 질문에 대답하지 않습니다 – smac89

+0

@ Smac89이 질문에 올바르게 대답하지 않는다고 생각하지만 답변입니다.그래서 이것을 다루는 적절한 방법은 하향 투표하는 것입니다. –

2

Map<String, Integer> myMap = new HashMap<String, Integer>(); 

저장 값을 사용해야합니다. int 또는 double이 작동하지 않습니다. 그 묶음 타입을 사용해야합니다. 예를 들어

Map<String,Integer> m = new HashMap<String,Integer>(); 

이제 두 가지 모두 개체이므로 작동합니다.

관련 문제