我搜索了互联网,但没有找到任何合适的解决方案。
在我的应用程序中,我有一个整数数组。我需要通过反射访问(分配)数组。应用程序创建一个包含Integer元素的对象数组。 Java不允许将此Object数组分配给Integer数组。
在Java中不可能吗?我的应用程序只知道Integer数组字段的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);
}
答案 0 :(得分: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[]
的实例。
答案 1 :(得分:1)
是的,Java数组的类型与其元素类型共同链接。具体来说,Object[]
是Integer[]
的超类型,因此与它不是分配兼容的。您必须在开始时创建Integer[]
才能将其分配给Integer[]
类型的变量。从您发布的代码中我可以看出没有理由不这样做。
答案 2 :(得分: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);