При попытке привести 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);
}