[java] java : (String []) List.toArray ()는 ClassCastException을 제공합니다.

다음 코드 (Android에서 실행)는 항상 세 번째 줄에 ClassCastException을 제공합니다.

final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();

v2가 Object [0]이고 문자열이있을 때도 발생합니다. 이유는 무엇입니까?



답변

이것은 당신이 사용할 때

 toArray() 

String []으로 형변환 할 수없는 Object []를 반환합니다 (내용이 String 인 경우에도). 이는 toArray 메서드가

List 

그리고 아닙니다

List<String>

제네릭은 소스 코드 일 뿐이며 런타임에는 사용할 수 없으므로 생성 할 배열 유형을 결정할 수 없습니다.

사용하다

toArray(new String[v2.size()]);

올바른 종류의 배열 (String [] 및 올바른 크기)을 할당합니다.


답변

당신은 잘못 사용하고 있습니다 toArray()

Java의 제네릭은 대부분 구문 설탕이라는 것을 기억하십시오. ArrayList는 실제로 모든 요소가 문자열이라는 것을 알지 못합니다.

문제를 해결하려면으로 전화하십시오 toArray(T[]). 귀하의 경우에는

String[] v3 = v2.toArray(new String[v2.size()]);

일반화 된 형식 toArray(T[])은을 반환 T[]하므로 결과를 명시 적으로 캐스팅 할 필요가 없습니다.


답변

String[] v3 = v2.toArray(new String[0]); 

또한 트릭을 수행하므로 올바른 ArrayType이 메소드에 제공되면 더 이상 캐스트 할 필요가 없습니다.


답변

String[] str = new String[list.size()];
str = (String[]) list.toArray(str);

이렇게 사용하십시오.


답변