Ява.ленг.ClassCastException: [Ljava.ленг.Объект; не может быть брошен в [Ljava.ленг.Строка;
мне нужно преобразовать HashMap в массив строк, следуйте моему java-коду
import java.util.HashMap;
import java.util.Map;
public class demo {
public static void main(String[] args) {
Map<String, String> map1 = new HashMap<String, String>();
map1.put("1", "1");
map1.put("2", "2");
map1.put("3", "3");
String[] str = (String[]) map1.keySet().toArray();
for(int i=0; i<str.length;i++) {
System.out.println(str[i]);
}
}
}
когда я запускаю код, я получаю следующее исключение ClassCastException.
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at demo.main(demo.java:17)
Я смущен этим, кто может мне помочь.
3 ответов
toArray()
возвращает Object[]
, независимо от дженериков. Вместо этого вы можете использовать перегруженный вариант:
String[] str = map1.keySet().toArray(new String[map1.size()]);
кроме того, поскольку Set
' s toArray
метод не дает никакой гарантии о заказе, и все, что вы используете массив для печати значений, вы можете повторить keySet()
напрямую:
for (String str: map1.keySet()) {
System.out.println(str);
}
изменить:
Просто чтобы завершить картину, в Java 8,foreach
метод может быть использован, чтобы сделать код более элегантным:
map1.keySet().forEach(System.out::println);
Он возвращался Object[]
Не String[]
. Попробуйте это:
Object[] obj = (Object[]) map1.keySet().toArray();
for(int i=0; i<obj.length;i++) {
String someString = (String)obj[i];
System.out.println(someString);
}
toArray()
метод определен в интерфейсе списка, поэтому каждый, где есть экземпляр списка, у вас также есть доступ к этому методу.
сначала вы можете подумать, что вы можете привести массив объектов, элементы которых все типа String к массиву строк, но спецификации java говорят иначе ссылке, короче он говорит:
bArr = new B[]; A[] aArr = (A[]) bArr;
"работает" во время выполнения, если и только если b является подтипом A (или сама). Действительно ли B содержит только As is не имеет значения, и тип времени компиляции bArr также не используется (имеет значение тип времени выполнения):
в вашем коде по телефону:image_urls.toArray()
вы получите массив объекта, и поскольку объект не является подтипом строки, вы получите исключение. Для этого напишите, используйте другую перегрузку toArray()
что
возвращает массив определенного типа (для ссылки на тип), как указано в" Mureinik".