Java.lang.ClassCastException: [Ljava.lang.Object; не может быть применено к [Ljava.lang.String;

Мне нужно преобразовать HashMap в массив String, следовать моему 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)

Ответ 1

toArray() возвращает Object[], независимо от дженериков. Вместо этого вы можете использовать перегруженный вариант:

String[] str = map1.keySet().toArray(new String[map1.size()]);

В качестве альтернативы, поскольку метод Set toArray не дает никаких гарантий относительно порядка, и все, что вы используете для массива, это распечатывать значения, вы можете напрямую выполнить итерацию keySet():

for (String str: map1.keySet()) {
    System.out.println(str);
}

EDIT: Чтобы завершить изображение, в Java 8, метод foreach можно использовать, чтобы сделать код более элегантным:

map1.keySet().forEach(System.out::println);

Ответ 2

Возвращает 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);
}

Ответ 3

toArray() метод определен в интерфейсе списка, поэтому каждый раз, когда есть экземпляр List, вы также имеете доступ к этому методу.

Сначала вы можете подумать, что вы можете создать массив объектов, для которых все его элементы имеют тип String для массива String, но java specs говорит иначе Ссылка, вкратце говорится:

bArr = new B[]; A[] aArr = (A[]) bArr;

"работает" во время выполнения тогда и только тогда, когда B является подтипом A (или самого A). Действительно ли B содержит только As. Как не имеет значения, и не используется также тип времени компиляции bArr (что имеет значение для типа времени выполнения):

В вашем коде, вызвав: image_urls.toArray() вы получите массив Object, и поскольку Object не является SubType для String, вы получаете исключение. Для этого напишите, используйте другую перегрузку toArray(), которая получает массив определенного типа (для ссылки на тип), как указано в "Mureinik".