При попытке привести setInstance.toArray() к Integer[], нет ошибки времени компиляции, но есть ошибка времени выполнения, почему?

Я экспериментирую с классом Java HashSet и его методом toArray(). Ниже приведен код, который я придумал. Компилятор не отображал никаких ошибок, но когда я запускаю код, IDE выводит сообщение об ошибке:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
    at JTOCollection.TheCollectionInterface.main(TheCollectionInterface.java:26)
Java Result: 1

Из-за моей неопытности я не могу полностью понять причину сообщения об ошибке, может кто-нибудь объяснить мне это?

Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
set1.add(3);
set1.add(2);

Integer[] intArray = (Integer[]) set1.toArray();
for(Integer i : intArray){
    System.out.println(i);
}

3 ответа

Решение

Потому что вы используете public Object[] toArray() вместо public <T> T[] toArray(T[] a),

использовать этот:

Integer[] intArray =  set1.toArray(new Integer[set1.size()]);

документы для: public <T> T[] toArray(T[] a)

Возвращает массив, содержащий все элементы в этой коллекции; тип времени выполнения возвращаемого массива является типом указанного массива. Если коллекция помещается в указанный массив, она возвращается в него. В противном случае новый массив выделяется с типом времени выполнения указанного массива и размером этой коллекции.

set1.toArray() является объектом [] и не может быть приведен к целому числу []. Если вы хотите получить целое число [], попробуйте это:

Integer[] intArray = set1.toArray(new Integer[set1.size()]);

Метод set1.toArray() возвращает Object[], вам нужно явно привести каждый объект в возвращаемом массиве к Integer. Ниже код будет работать для вас.

Set<Integer> set1 = new HashSet<>();
    set1.add(1);
    set1.add(2);
    set1.add(3);
    set1.add(2);

    Object[] intArray = set1.toArray();
    for(Object i : intArray){
        System.out.println(i);
    }
Другие вопросы по тегам