다음 코드 (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);
이렇게 사용하십시오.