2013-04-18 2 views
1

В следующем коде я ожидаю, что pn.get(8).get(8) вернет массив из Integers (в этом примере длина массива равна 1, но в моей программе она длиннее) , Вместо этого я получаю массив из Objects.HashSet «не может преобразовать из типа элемента Object в Integer» при ожидании HashSet Integer

Может кто-нибудь скажет мне, почему и что я делаю неправильно.

ArrayList<ArrayList<HashSet<Integer>>> pn = 
    new ArrayList<ArrayList<HashSet<Integer>>>(); 

for (int x = 0; x < 9; x++) 
{ 
    pn.add(x, new ArrayList<HashSet<Integer>>()); 

    for (int y = 0; y < 9; y++) { 
     pn.get(x).add(y, new HashSet<Integer>()); 
     pn.get(x).get(y).add(new Integer(x)); 
    } 
} 


for (Integer i: pn.get(8).get(8).toArray()) 
{ 
    System.out.println(i); 
} 
+0

Откуда вы знаете, что получаете массив объектов? Вы получаете исключение? – drewmoore

+0

yes: Исключение в потоке "main" java.lang.Error: Неразрешенная проблема компиляции: \t Тип несоответствия: невозможно преобразовать из типа элемента Object to Integer –

+1

см. Мой ответ ... – drewmoore

ответ

3

Все, что вам нужно сделать, это удалить toArray() вызов в вашем for заявлении, которое возвращается Object[] вместо Integer[], как вы могли бы ожидать. Это артефакт, как Java implements generics using type erasure. Время выполнения, JVM не знает, что ваш HashSet имеет тип Integer, поэтому toArray() должен вернуть массив Object[].

К счастью, HashSet может быть итерирован напрямую, поэтому вызов toArray() не нужен. Следующие работы для меня:

ArrayList<ArrayList<HashSet<Integer>>> pn = new ArrayList<ArrayList<HashSet<Integer>>>(); 

for (int x = 0; x < 9; x++) 
{ 
    pn.add(x, new ArrayList<HashSet<Integer>>()); 

    for (int y = 0; y < 9; y++) { 
     pn.get(x).add(y, new HashSet<Integer>()); 
     pn.get(x).get(y).add(new Integer(x)); 
    } 
} 


for (Integer i: pn.get(8).get(8)) 
{ 
    System.out.println(i); 
} 
1

Снимите toArray(), он возвращает Object[], в то время как вы переменная цикла является Integer, следовательно, ошибка.

for (Integer i: pn.get(8).get(8)) 
    { 
     System.out.println(i); 
    } 
1

<Collection>.toArray по умолчанию будет возвращать нетипизированное (Object) массив. Для того, чтобы ввести его, то есть сказать, какой тип использовать (Integer в вашем случае), используйте:

Integer[] integers = pn.get(8).get(8).toArray(new Integer[pn.get(8).get(8).size()]); 
1

Это происходит в результате типа стирания (See oracle doc here), который становится проблемой, когда вы звоните ToArray(). Поскольку HashSet является итерацию сбор, призыв к ToArray() не является необходимым в любом случае: Вы можете просто использовать for (Integer i: pn.get(8).get(8))

1

Если вы действительно хотите, чтобы массив попробовать этот

HashSet<Integer> temp = pn.get(8).get(8); 
    Integer i[] = new Integer[temp.size()] ; 

    for (Integer j: temp.toArray(i)) { 
     System.out.println(j); 
    } 

В противном случае

for (Integer j: pn.get(8).get(8)){ 
     System.out.println(j); 
    } 

будет работать просто отлично.