4

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

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

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

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

3 回答 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[].

于 2013-09-20T12:18:49.853 回答
1

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

于 2013-09-20T12:18:41.580 回答
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);
于 2013-09-20T12:26:21.720 回答