2

Java のすべてのプリミティブ型には、同じ値と null を表すことができる参照型があることを理解しています。たとえば、int と java.lang.Integer です。

また、すべての配列 (java.lang.Object[] も含む) は java.lang.Object から派生していますが、非プリミティブ型の配列のみが java.lang.Object[] に変換できることも理解しています。

つまり、次のことができます。

Class type = Integer.class;
Object[] o = (Object[])java.lang.reflect.Array.newInstance(type, 4);

ただし、次の場合は例外になります。

Class type = int.class;
Object[] o = (Object[])java.lang.reflect.Array.newInstance(type, 4);

したがって、その特定のケースでは、次のことができます。

 Class type = int.class;
 Object o = java.lang.reflect.Array.newInstance(type, 4);

... Object[] に変換できない配列を表す Object に要素を追加する方法を疑問に思うまでは、これで問題ないようです。

この問題を回避する唯一の方法は、配列の要素の型を確認し、オブジェクトを適切にキャストすることですか?

すなわち:

  if (type == int.class)
  ((int[])o)[0] = getFirstElement();

  else if (type == short.class)
  ((short[])o[0] = getFirstElement();
4

2 に答える 2

1

最初のケースでは、Object に割り当ててから、ObjectisInstanceOf Object[]の配列があるかどうかを確認するために使用できます。

ただし、最終的には、要素へのアクセス/割り当てを行うには、何らかの条件付き操作が必要です。ありがたいことに、(IIRC) 7 つの異なるスカラー データ型しかありません。

(言語仕様では、Integer/Float/et al を定義して、配列メンバー アクセス メソッドを含めることができます。たとえば、Integer は の get および set メソッドを定義しますint[]。しかし、そうではありませんでした。せいぜい、(残念ながら、 final) これらのメソッドを定義するためのサブクラスの数。)

于 2013-02-11T20:01:45.880 に答える
1

配列の作成に加えてjava.lang.reflect.Array、配列内の要素を取得および設定するメソッドも提供します。

Class<?> type = int.class;
Object array = java.lang.reflect.Array.newInstance(type, 4);

int index = 0;
Object value = getFirstElement();
java.lang.reflect.Array.set(array, index, value);

また、ドキュメントから、その値に注意してください。is first automatically unwrapped if the array has a primitive component type. したがって、これは、から継承しないものを含む、任意の配列に対して機能するはずObject[]です。

対応するObject get(Object array, int index)方法もあります。

于 2013-02-11T20:37:27.910 に答える