2011-11-27 5 views
3

Почему я получаю исключениеПочему существует исключение для следующего java-кода?

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; 
     at Main.main(Main.java:12) 

для следующего кода?

import java.util.Set; 
import java.util.HashMap; 


public class Main 
{ 
     public static void main(String args[]) 
     { 
       HashMap<Integer, Double> h = new HashMap<Integer,Double>(); 
       h.put(1, 2.2); 

       Integer[] keys = (Integer[])h.keySet().toArray(); 
     } 
} 

Если это не представляется возможным забрасывать Object [] вернулся в Integer [], так как набор ключей содержит целые числа? Что такое быстрая альтернатива копированию набора ключей в массив целых чисел?

+0

Типы массивов не могут быть напрямую подобными. – Polynomial

ответ

4

Использование

Integer[] keys = h.keySet().toArray(new Integer[h.keySet().size()]); 

Passing массив того же размера, что и набор ключей действительно лучший способ, потому что Java будет использовать заданный массив для хранения всех значений набора ключей. Если данный массив не такого размера, как набор ключей, Java должен будет создать совершенно новый массив, соответствующий размеру набора ключей. Прошедший первый массив никогда не будет использоваться, он просто будет занимать память, пока сборщик мусора не выделит его снова.

1

Нет, вы не можете напрямую делать так.

Если вы хотите Integer[], попробуйте h.keySet().toArray(new Integer[0]).

Set#toArray(T[])

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

+0

@downvoter Почему? – Jeffrey

2

Обеспечить массив правильного типа к методу ToArray:

Integer[] keys = h.keySet().toArray(new Integer[0]); 
Смежные вопросы