2013-09-20 4 views
3

Я искал в Интернете, но не нашел подходящего решения.Назначить массив объектов с элементами Integer в массив Integer

В моем приложении у меня есть массив целых чисел. Мне нужно получить доступ (присваивать) массив через отражение. Приложение создает массив объектов, содержащий элементы Integer. Java не позволяет присваивать этот массив Object массиву Integer.

Невозможно ли на Java? Мое приложение знает только класс Object поля Integer array. Код динамически. Тип может быть произвольным.

private final Integer[] destArray = new Integer[2]; 

public static void main(final String[] args) throws Exception { 
    final ReloadDifferentObjectsTest o = new ReloadDifferentObjectsTest(); 
    final Object[] srcArray = {Integer.valueOf(1), Integer.valueOf(2)}; 
    final Field f = o.getClass().getDeclaredField("destArray"); 
    f.setAccessible(true); 

    // first trial 
    // f.set(o, srcArray); 

    // second trial 
    // Object tmpArray = Array.newInstance(f.getType().getComponentType(), srcArray.length); 
    // tmpArray = Arrays.copyOfRange(srcArray, 0, srcArray.length); 
    // f.set(o, tmpArray); 

    // third trial 
    Object tmpArray = Array.newInstance(f.getType().getComponentType(), srcArray.length); 
    tmpArray = f.getType().getComponentType().cast(Arrays.copyOfRange(srcArray, 0, srcArray.length)); 
    f.set(o, tmpArray); 
} 

ответ

0

Хорошо, нашел решение ... Я должен установить для каждого отдельного элемента с помощью отражения:

// fourth trial 
final Object tmpArray = Array.newInstance(f.getType().getComponentType(), srcArray.length); 
for (int i = 0; i < srcArray.length; i++) { 
    Array.set(tmpArray, i, srcArray[i]); 
} 

f.set(o, tmpArray); 
1

Да, тип массива Java ковариантно связан с его типом элемента. В частности, Object[] является супертипом Integer[] и поэтому не совместим с ним. Вы должны сначала создать Integer[], чтобы иметь возможность присвоить его переменной Integer[]. Из вашего опубликованного кода я не вижу причин, почему вы этого не сделали.

3

Нет, вы не можете отличить значение, которое на самом деле является ссылкой на экземпляр Object[] переменной Integer[] - и это хорошо. Представьте себе, если бы это было действительным ... считать:

Object[] values = { new Integer(5), new Integer(10) }; 
Integer[] integers = values; 
Integer x = integers[0]; // Okay so far 

values[0] = new Object(); // Sneaky! 
Integer y = integers[0]; // ??? This would have to fail! 

Если вы хотите, чтобы бросить что-то Integer[], он должен фактически быть Integer[]. Так эта линия:

final Object[] srcArray = {Integer.valueOf(1), Integer.valueOf(2)}; 

... необходимо изменить, чтобы создать экземпляр Integer[].

Смежные вопросы