如果我有一个原始包装类实例的数组,我如何获得它们各自的原始数组?
Object toPrimitiveArray(Object[] wrappedArray) {
return ?;
}
Object primitiveArray = toPrimitiveArray(new Integer[] { 1, 2, 3 });
在上面的示例中,我想toPrimitiveArray()
返回一个int[]
包含int
值1
、2
和3
.
如果我有一个原始包装类实例的数组,我如何获得它们各自的原始数组?
Object toPrimitiveArray(Object[] wrappedArray) {
return ?;
}
Object primitiveArray = toPrimitiveArray(new Integer[] { 1, 2, 3 });
在上面的示例中,我想toPrimitiveArray()
返回一个int[]
包含int
值1
、2
和3
.
问题是您的方法无法知道数组包含什么类型的 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 . . .
但是,这很丑陋,并且不允许编译器检查代码中的类型安全性,因此增加了出错的机会。
您可以切换到使用数字对象列表而不是数组吗?然后你可以使用类型参数(泛型)来保证类型安全。
这个怎么样:
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;
}
试试这个....
遍历 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 类型,然后将其转换为各自的原语。
这个答案已经很晚了,但希望它可以帮助未来的访问者解决这个问题。我对反射解决方案的看法可以改进,但基本思想是这样的:
@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
提供了数组。