将包装器数组转换为基元数组

时间:2012-07-15 14:45:16

标签: java reflection wrapper primitive

如果我有一个原始包装类的实例数组,我怎样才能获得它们各自原语的数组?

Object toPrimitiveArray(Object[] wrappedArray) {
    return ?;
}

Object primitiveArray = toPrimitiveArray(new Integer[] { 1, 2, 3 });

在上面的示例中,我希望toPrimitiveArray()返回包含int[]int 123的{​​{1}} }。

4 个答案:

答案 0 :(得分:2)

问题是你的方法无法知道数组包含什么类型的Number,因为你只将它定义为Object数组,没有更多信息。因此,在不损失编译时类型安全性的情况下,无法自动生成基本数组。

您可以使用反射来检查对象类型:

if(obj instanceof Integer) {
    //run through array and cast to int
} else if (obj instanceof Long) {
    //run through array and cast to long
} // and so on . . .

但是,这很难看,并且不允许编译器检查代码中的类型安全性,因此增加了出错的可能性。

您可以切换到使用Number of Number对象而不是数组吗?然后你可以使用类型参数(泛型)来保证类型安全。

答案 1 :(得分:1)

这个怎么样:

int[] toPrimitiveArray(Integer[] wrappedArray) {
  int[] array = new int[wrappedArray.length];
  for(int i = 0; i < wrappedArray.length; i++)
    array[i] = wrappedArray[i].intValue();
  return array;
}

答案 2 :(得分:0)

试试这个......

遍历wrappedArray中的每个元素并将其转换为原始int

class Test {



     public int[] toPrimitiveArray(Object[] wrappedArray) {

         int i = 0;
         int[] arr = new int[wrappedArray.length];

           for ( Object w : wrappedArray){


               arr [i] = (Integer) w;
                       i++;
           }

            return arr;
        }



        public static void main(String[] args){

            int[] a = new Test().toPrimitiveArray(new Integer[] { 1, 2, 3 });

            for (int b : a){

                System.out.println(b);
            }
        }


    }

<强>编辑:

如果需要将所有Wrapper类型转换为其各自的基本类型..

您需要使用instanceof来了解Wrapper类型,然后将其转换为各自的原语。

答案 3 :(得分:0)

这个答案很晚,但希望它可以帮助未来的访问者解决这个问题。 我对反思性解决方案的看法可以改进,但基本思路是:

@SuppressWarnings("unchecked")
private static <TArray, TElement> TArray toArray(final Object elements, final Class<TElement> elementType)
{
  final int length = java.lang.reflect.Array.getLength(elements);
  final Object resultArray = java.lang.reflect.Array.newInstance(elementType, length);

  for (int i = 0; i < length; ++i)
  {
    final Object value = java.lang.reflect.Array.get(elements, i);

    java.lang.reflect.Array.set(resultArray, i, value);
  }

  return (TArray)resultArray;
}

然后使用如下:

final Boolean[] booleans = new Boolean[] { true, false, true, true, false };
final boolean[] primitives = toArray(booleans, boolean.class);

System.out.println(Arrays.asList(booleans));

for (boolean b : primitives)
{
  System.out.print(b);
  System.out.print(", ");
}

打印出来:

[true, false, true, true, false]
true, false, true, true, false,

此实用程序可帮助我们从java.sql.Array中提取数组,因为java.sql.Array仅为数组提供了Object