source

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

itover 2022. 11. 22. 21:29
반응형

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

다음 코드(안드로이드에서 실행)는 항상 세 번째 줄에 ClassCastException을 표시합니다.

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

v2가 오브젝트[0]일 때도 발생하며 문자열이 포함되어 있을 때도 발생합니다.왜 그런지 추측이라도?

이것은, 을 사용할 때,

 toArray() 

오브젝트[]를 반환한다.이 오브젝트는 String[]에 캐스팅할 수 없다(내용은 String이더라도).그 이유는 toArray 메서드에서는

List 

가 아니라

List<String>

generic은 소스 코드일 뿐 런타임에는 사용할 수 없기 때문에 작성할 어레이의 유형을 결정할 수 없습니다.

사용하다

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

적절한 종류의 어레이(String[] 및 적절한 크기의 어레이)를 할당합니다.

잘못 사용하고 있습니다.toArray()

Java의 제네릭은 대부분 통사설탕이라는 것을 기억하세요.ArrayList는 실제로 모든 요소가 String임을 인식하지 않습니다.

문제를 해결하려면 에 문의하십시오.당신의 경우,

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

범용화된 폼은toArray(T[])돌아온다T[]따라서 결과를 명시적으로 캐스팅할 필요가 없습니다.

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

또한 적절한 ArrayType이 메서드에 지정되면 캐스팅할 필요도 없습니다.

사용.toArrayJDK 11 Stream API에서는 다음과 같이 일반적인 문제를 해결할 수 있습니다.

Object[] v1 = new String[] {"a", "b", "c"}; // or array of another type
String[] v2 = Arrays.stream(v1)
    .<String>map((Object v) -> v.toString()).toArray(String[]::new);
String[] str = new String[list.size()];
str = (String[]) list.toArray(str);

이렇게 쓰세요.

언급URL : https://stackoverflow.com/questions/5690351/java-stringlist-toarray-gives-classcastexception

반응형