Der folgende Code (in Android ausgeführt) gibt mir immer eine ClassCastException in der 3. Zeile:
final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();
Dies passiert auch, wenn v2 Object [0] ist und wenn Strings darin sind. Irgendeine Idee warum?
java
list
classcastexception
toarray
Gavriel
quelle
quelle
toArray()
Methode ist.Antworten:
Dies liegt daran, wenn Sie verwenden
Es gibt ein Objekt [] zurück, das nicht in einen String [] umgewandelt werden kann (obwohl der Inhalt Strings ist). Dies liegt daran, dass die toArray-Methode nur einen erhält
und nicht
Da Generika nur Quellcode sind und zur Laufzeit nicht verfügbar sind, kann nicht bestimmt werden, welcher Array-Typ erstellt werden soll.
verwenden
welches die richtige Art von Array zuweist (String [] und von der richtigen Größe)
quelle
toArray
Methoden existierten, bevor die Sammlungsklassen generisch waren.toArray(new String[0])
eher verwenden sollte: "In älteren Java-Versionen wurde die Verwendung eines Arrays mit vorgefertigter Größe empfohlen, da der Reflection-Aufruf, der zum Erstellen eines Arrays mit der richtigen Größe erforderlich ist, ziemlich langsam war. Seit späten Updates von OpenJDK 6 Dieser Aufruf war intrinsisch, wodurch die Leistung der leeren Array-Version gleich und manchmal sogar noch besser wurde. Auch das Übergeben eines vorgroßen Arrays ist für eine gleichzeitige Sammlung gefährlich, da ein Rennen zwischen demsize
und demtoArray
Aufruf möglich ist. "Sie verwenden das falsche
toArray()
Denken Sie daran, dass Javas Generika hauptsächlich syntaktischer Zucker sind. Eine ArrayList weiß nicht, dass alle ihre Elemente Strings sind.
Rufen Sie an, um Ihr Problem zu beheben
toArray(T[])
. In deinem Fall,Beachten Sie, dass das generierte Formular
toArray(T[])
zurückgegeben wirdT[]
, sodass das Ergebnis nicht explizit umgewandelt werden muss.quelle
Beachten Sie auch, dass Sie nicht einmal mehr umwandeln müssen, sobald der Methode der richtige ArrayType zugewiesen wurde.
quelle
Verwenden Sie so.
quelle