Poniższy kod (uruchamiany w systemie Android) zawsze daje mi wyjątek ClassCastException w trzeciej linii:
final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();
Dzieje się tak również, gdy v2 to Object [0], a także gdy są w nim ciągi znaków. Każdy pomysł, dlaczego?
java
list
classcastexception
toarray
Gavriel
źródło
źródło
toArray()
metody.Odpowiedzi:
Dzieje się tak, ponieważ kiedy używasz
zwraca Object [], którego nie można rzutować na String [] (nawet jeśli zawartość jest ciągami znaków) Dzieje się tak, ponieważ metoda toArray pobiera tylko
i nie
ponieważ typy generyczne to tylko kod źródłowy i nie są dostępne w czasie wykonywania, więc nie może określić, jaki typ tablicy należy utworzyć.
posługiwać się
który przydziela odpowiedni rodzaj tablicy (String [] i odpowiedni rozmiar)
źródło
toArray
metody istniały przed klasach zbiórki były średnie.toArray(new String[0])
raczej: „W starszych wersjach Javy zalecano używanie wstępnie ustalonej tablicy, ponieważ wywołanie odbicia, które jest konieczne do utworzenia tablicy o odpowiednim rozmiarze, było dość powolne. Jednak od późnych aktualizacji OpenJDK 6 to wywołanie było zintegro- wane, sprawiając, że wydajność wersji pustej tablicy była taka sama, a czasem nawet lepsza. Również przekazywanie tablicy o wstępnie ustalonym rozmiarze jest niebezpieczne dla kolekcji współbieżnej, ponieważ między wywołaniemsize
a jest możliwy wyścigtoArray
. "Używasz złego
toArray()
Pamiętaj, że leki generyczne w Javie to głównie cukier syntaktyczny. ArrayList w rzeczywistości nie wie, że wszystkie jej elementy są łańcuchami.
Aby rozwiązać problem, zadzwoń
toArray(T[])
. W Twoim przypadku,Zwróć uwagę, że uogólniony formularz
toArray(T[])
zwracaT[]
, więc wynik nie musi być jawnie rzutowany.źródło
również załatwia sprawę, pamiętaj, że nie musisz już nawet rzucać, gdy odpowiedni typ ArrayType zostanie przekazany metodzie.
źródło
Użyj w ten sposób.
źródło