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 中。

解决这个问题的唯一方法是检查数组元素的类型并适当地转换 Object 吗?

IE:

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

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

2 回答 2

1

好吧,在第一种情况下,您可以分配给 Object,然后使用它isInstanceOf Object[]来查看您是否有一个 Object 数组。

但最终你必须有某种条件操作来进行元素访问/分配。值得庆幸的是,只有 (IIRC) 7 种不同的标量数据类型。

(语言规范本可以定义 Integer/Float/et al 以包括数组成员访问方法——例如,Integer 将为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. So 这应该适用于任何数组,包括那些不继承自Object[].

也有相应的Object get(Object array, int index)方法。

于 2013-02-11T20:37:27.910 回答