是否有一种通用的方法来处理java中的基元数组和非基元数组?

时间:2013-02-11 19:49:24

标签: java arrays type-conversion

据我所知,对于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();

2 个答案:

答案 0 :(得分:1)

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

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

(语言规范可能已经定义了Integer / Float / et等包含数组成员访问方法 - 例如,Integer将为int[]定义get和set方法。但是他们没有。最多你可以为(alas,final)Number子类定义包装器来定义这些方法。)

答案 1 :(得分: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);

还要从documentation注意值is first automatically unwrapped if the array has a primitive component type.所以这适用于任何数组,包括那些不从Object[]继承的数组。

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