将包含整数元素的对象数组赋值给整数数组

4

我在互联网上搜索了但没有找到合适的解决方案。

我的应用程序中有一个整数数组。我需要通过反射访问(赋值)该数组。应用程序创建一个包含Integer元素的对象数组。Java不允许将此Object数组分配给Integer数组。

这在Java中不可能吗?我的应用程序只知道整数数组字段的Class Object。代码是动态的。类型可能是任意类型。

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);
}
3个回答

4
不,你不能将实际上是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[] 实例的方式。


1
是的,Java数组的类型与其元素类型是协变链接的。具体来说,Object[]Integer[]的超类型,因此不能赋值给它。您必须在开始时创建一个Integer[]才能将其分配给Integer[]类型的变量。从您发布的代码中,我看不出为什么您不这样做。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接