2012-07-15 72 views
4

如果我有一個基本包裝類的實例數組,我該如何獲得它們各自的基元數組?將一個包裝數組轉換爲一個基元數組

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

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

在上述例子中,我想toPrimitiveArray()返回包含該int12一個int[],和3

+0

'final int [] ret = new int [wrappedArray.length]; int i = 0; for(int w:wrappedArray)ret [i ++] = w;返回ret;' – 2012-07-15 14:52:07

+0

@MarkoTopolnik,更新了問題以反映我的情況。我知道它收到一個原始包裝類的數組。我可以通過反射獲得實際的類和相關的基元類型。 – rid 2012-07-15 14:55:55

+0

沒有從'Integer.class'到'int []'的自動方法。您必須爲每種類型明確進行該轉換。您還需要爲提取原始值的每種封裝類型調用不同的方法。你會以極其緩慢,令人費解的反射意大利麪或者快速重複的文字代碼結束。 – 2012-07-15 15:08:33

回答

2

問題是您的方法無法知道數組中包含的是什麼類型的數字,因爲您只將它定義爲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 . . . 

然而,這是醜陋的,不會讓編譯器來檢查你的代碼類型安全,因此增加了出錯的機會。

你可以切換到使用數字列表而不是數組嗎?然後你可以使用類型參數(泛型)來保證類型安全。

+0

它可以包含任何包裝,不僅包括數字。例如,它可以包含Character包裝器的一個實例數組。雖然在調用方法之前,我確信會傳遞一個包裝數組。 – rid 2012-07-15 14:57:41

+0

類型安全是OP最少的問題。 – 2012-07-15 15:24:44

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; 
} 
+0

爲什麼不返回'int []'? – 2012-07-15 14:54:53

+0

確實,如果我知道它需要一個'Integer []',我應該知道如何創建'int []'。更新了問題以反映我的情況。我只知道它是一個包裝類的數組,我可以通過反射獲得類本身以及與之相關的原始類型。 – rid 2012-07-15 14:55:13

+0

已編輯。這是否更好? – vainolo 2012-07-15 14:55:58

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); 
      } 
     } 


    } 

編輯:

如果您需要將所有包裝類型轉換爲其各自的原始類型..

您需要使用instanceof來了解包裝類型,然後將其轉換爲其各自的基元。

+0

該方法可以採用任何類型的包裝的數組。更新的問題。 – rid 2012-07-15 14:56:26

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的數組。

相關問題