2013-08-15 1 views
8

배열을 만들고 거기에 객체를 저장하려고하는 다음 코드가 있습니다. 런타임에는 ArrayStoreException이 표시됩니다.제네릭 어레이 생성이 예상대로 작동하지 않는 이유는 무엇입니까?

import java.lang.reflect.Array; 

public class GenericsArrayCreation<T> { 

    public static <T> void Test(T[] A){ 
     @SuppressWarnings("unchecked") 
     T[] temp = (T[]) Array.newInstance(A.getClass(), A.length); 
     for(int i = 0;i<temp.length;i++){ 
      temp[i] = A[i]; 
      System.out.println(temp[i].toString()); 
     } 
    } 

    public static void main(String[] args){ 
     String[] strs = {"a", "b", "c"}; 
     GenericsArrayCreation.Test(strs); 
    } 
} 

어떻게 든이 왜 잘못 때문에 문

T[] temp = (T[]) Array.newInstance(A.getClass(), A.length); 

의 것을 이해? 런타임에 A.getClass()String을 반환하므로 temp은 문자열 배열이어야합니다. 이 경우, temp[i] = A[i] 할당이 작동하지 않는 이유는 무엇입니까?

+0

'A.getClass()'가'String'이라는 것을 (디버거 또는'print' 문에) 확인 했습니까? – chrylis

답변

6

A의 유형은 java.lang.String이 아닌 java.lang.String[]입니다.

배열 유형 자체가 아닌 배열의 구성 요소 유형을 원합니다.

사용하는 대신이 라인 :

T[] temp = (T[]) Array.newInstance(A.getClass().getComponentType(), A.length); 

와 코드가 잘 실행됩니다. 당신이 ArrayStoreException을 받고있는 이유

+0

감사합니다. 고쳐! –

0

인쇄를 시도하십시오 temp.getClass() - 배열 배열 T[][]입니다. Class.getComponentType이 필요합니다.

+0

No. doc가 말하는 것 : componentType이 배열 클래스를 나타내는 경우, 새로운 배열의 차원 수는 dimensions.length와 componentType의 차원 수의 합계와 같습니다. 이 경우 새 배열의 구성 요소 유형은 componentType의 구성 요소 유형입니다. – nes1983

+0

@ nes1983 무엇? * "배열의 구성 요소 유형을 나타내는 클래스를 반환합니다.이 클래스가 배열 클래스를 나타내지 않으면이 메서드는 null을 반환합니다."* –

+0

솔직히이 API는 짜증이납니다. – nes1983

0

당신의 A.getClass() 리턴한다 String 배열이 아닌 String는 이잖아.

관련 문제