2011-11-27 4 views
3

이유는 예외 다음 코드다음 Java 코드에 대한 예외가있는 이유는 무엇입니까?

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; 
     at Main.main(Main.java:12) 

를 얻을 수 있습니까? 키 세트가 정수를 포함하고 있기 때문에

import java.util.Set; 
import java.util.HashMap; 


public class Main 
{ 
     public static void main(String args[]) 
     { 
       HashMap<Integer, Double> h = new HashMap<Integer,Double>(); 
       h.put(1, 2.2); 

       Integer[] keys = (Integer[])h.keySet().toArray(); 
     } 
} 

개체는 [] 정수 []로 돌아 캐스트 할 수 있어야하지 않나요? 키 배열을 정수 배열로 복사하는 빠른 대안은 무엇입니까?

+0

배열 유형을 직접 형 변환 할 수 없습니다. – Polynomial

답변

4

사용

Integer[] keys = h.keySet().toArray(new Integer[h.keySet().size()]); 

같은 크기의 배열을 전달을 지정된 배열이 키 세트의 모든 값을 포함합니다. 지정된 배열이 키 세트와 같은 크기가 아닌 경우 Java는 키 세트의 크기에 맞게 완전히 새로운 배열을 만들어야합니다. 전달 된 첫 번째 배열은 사용되지 않으며 가비지 수집기가 다시 할당 할 때까지 메모리를 차지합니다.

1

아니요, 직접 캐스팅 할 수 없습니다.

Integer[]을 원할 경우 h.keySet().toArray(new Integer[0])을 시도하십시오.

Set#toArray(T[])

또는, toArray()에 의해 반환 된 배열을 반복, 올바른 크기의 자신의 Integer[]을 만들 수 있고 수동으로 각 요소를 캐스팅.

+0

@downvoter 왜? – Jeffrey

2

toArray 방법에 대한 올바른 유형의 배열 제공 : 자바를 사용하기 때문에 키 집합이 가장 좋은 방법은 참으로

Integer[] keys = h.keySet().toArray(new Integer[0]); 
관련 문제