4

インターネットで検索しましたが、適切な解決策が見つかりませんでした。

私のアプリケーションでは、整数の配列を持っています。リフレクションを介して配列にアクセス (割り当て) する必要があります。アプリケーションは、Integer 要素を含むオブジェクト配列を作成します。Java では、この Object 配列を Integer 配列に割り当てることはできません。

Javaではできませんか?私のアプリケーションは、Integer 配列フィールドのクラス オブジェクトしか知りません。コードは動的です。型は任意の型でよい。

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[]投稿されたコードから、そうしない理由がわかりません。

于 2013-09-20T12:18:41.580 に答える