簡體   English   中英

將具有Integer元素的Object數組分配給Integer數組

[英]Assign Object array with Integer elements to Integer array

我搜索了互聯網,但沒有找到任何合適的解決方案。

在我的應用程序中,我有一個整數數組。 我需要通過反射訪問(分配)數組。 應用程序創建一個包含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);
}

不,你不能將一個實際上是對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[]的實例。

是的,Java數組的類型與其元素類型共同鏈接。 具體來說, Object[]Integer[]的超類型,因此與它不是賦值兼容的。 您必須在開始時創建一個Integer[] ,以便能夠將其分配給Integer[] -typed變量。 從您發布的代碼中我可以看出沒有理由不這樣做。

好的,找到了解決方案......我必須通過反射設置每個元素:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM