2014-11-27 3 views
0

목록 형식 데이터 컬렉션을 배열로 변환하려고합니다.목록을 배열로 변환 할 수없는 이유는 무엇입니까?

public void method1(List s1){ 
    List s=s1; 
    String []array = new String[s.size()]; 
    array=(String[])s.toArray(); 
    for(int i=0;i<array.length;i++){ 
     System.out.println(array[i]); 
    } 
    } 

다음과 같은 클래스 캐스트 예외가 발생합니다. 오류 줄은 "array = (String []) s.toArray();"입니다. 선.

java.lang.ClassCastException : [Ljava.lang.Object; [Ljava.lang.String;

그 이유는 무엇입니까?

+0

확인 http://stackoverflow.com/questions/9572795/convert-list-to-array-in -java – Adi

+0

목록에 문자열 만 포함되어 있습니까? – khelwood

답변

2

List.toArray()인터페이스의 메서드이고이며 문서에서는이 메서드에서 반환되는 배열의 종류를 지정하지 않습니다. 그러나 제안 된 다른 대답과 달리 List.toArray() 메서드는 런타임에 목록의 제네릭 형식을 알 수 없으므로 목록의 제네릭 형식 배열을 반환 할 수 없습니다.

따라서 표준 API에 내장 된 List의 모든 구현은 이 아닌 Object[]을 반환합니다.

그러나 사전 할당 된 배열을 List.toArray(Object[]) 메서드에 전달할 수 있습니다. 그렇게하면 전달한 배열과 동일한 요소 유형을 갖는 반환 값을 얻을 수 있습니다. 전달한 배열의 크기가 목록 자체와 동일한 경우 해당 배열이 사용됩니다 (그렇지 않으면, 적절한 크기의 새로운 배열이이 문제를 해결할 것입니다

) 내부적으로 할당 :

public void method1(List s) { 
    String[] array = s.toArray(new String[s.size()]); // <-- pass the array as an argument 
    for (int i = 0; i < array.length; i++) { 
     System.out.println(array[i]); 
    } 
} 
+0

당신은 캐스팅 할 필요가 없다는 것을 제외하고. toArray (T []) 메서드는 템플릿 처리됩니다. –

+0

좋은 점, 편집 해 드리겠습니다 –

+1

올바른 크기의 배열을 만들 필요는 없습니다. 'String [] array = s.toArray (new String [0]);'도 작동합니다. 또는'empty array' 경고를 피하기 위해'String [] array = s를 사용하십시오.toArray (new String [1]); ' – Tom

1

목록에 제네릭 형식을 지정하지 않았으며 array를 array of array of array로 선언했습니다. 이 작업을해야합니다 :

public void method1(List<String> s1){ 
    List<String> s=s1; 
    String []array = new String[s.size()]; 
    array = (String[])s.toArray(array); 
    for(int i=0;i<array.length;i++){ 
     System.out.println(array[i]); 
    } 
} 

편집 대신 Object[] 반환 List#toArray()
, 당신은 매개 변수로 전달 된 형식을 반환 List#toArray(T[] a)를 사용해야합니다.

+0

동일한 오류가 다시 발생했습니다. 해결되지 않았습니다 – Maduri

+0

@ Madur 당신이 맞습니다, 해결되었습니다. 이제 작동합니다. –

+1

OP에 대한 참고 사항 : s1을 s에 할당하면 같은 목록에 대한 참조 만 제공됩니다. 내가 아는 한 실제로는 당신을 위해 아무것도하지 않습니다. 아마 그 줄을 생략 할 수 있습니다. 이 답변에 대한 참고 사항 : Do array = s.ToArray (array); 나는 그것이 효과가있을 것이라고 믿습니다. –