2016-02-25 106 views
1

單維基本數組在泛型方法上無法正常工作。 new int []應該作爲T []而不是T來傳遞。由於isArray(),我能夠區分一個數組,但在嘗試執行Arrays.deepToString()時遇到問題。如何將通用對象轉換爲基本數組?如何將普通對象轉換爲基本數組?

/* Output 
println(T $obj) 
1 
println(T[] $obj) 
[1] 
println(T[] $obj) 
[[1]] 
println(T[] $obj) 
[[[1]]] 
println(T $obj) 
1 
println(T $obj) 
Exception in thread "main" java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object; 
    at Test.doSomething(Test.java:21) 
    at Test.main(Test.java:12) 
Java Result: 1 
*/ 

import java.util.Arrays; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     doSomething((Integer) 1); 
     doSomething(new Integer[]{1}); 
     doSomething(new Integer[][]{{1}}); 
     doSomething(new Integer[][][]{{{1}}}); 

     doSomething((int) 1); 
     doSomething(new int[]{1}); //java.lang.ClassCastException 
     doSomething(new int[][]{{1}}); 
     doSomething(new int[][][]{{{1}}}); 
    } 

    public static <T> void doSomething(T $obj) { 
     System.out.println("println(T $obj)"); 

     if ($obj.getClass().isArray()) { 
      System.out.println(Arrays.deepToString((T[]) $obj)); //java.lang.ClassCastException 
     } else { 
      System.out.println($obj); 
     } 
    } 

    public static <T> void doSomething(T[] $obj) { 
     System.out.println("println(T[] $obj)"); 

     if ($obj.getClass().isArray()) { 
      System.out.println(Arrays.deepToString($obj)); 
     } else { 
      System.out.println($obj); 
     } 
    } 
} 
+0

您不能將Java泛型與原始類型一起使用(至少沒有對相應的包裝器類型進行裝箱)。爲此,您需要像'public static void doSomething(T [] $ obj)'或可變參數版本'public static void doSomething(T ... $ obj)' –

+0

使用'switch' ['Class .getComponentType()'](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getComponentType%28%29)應該這樣做。 – Obicere

回答

1

你不能。 Arrays.deepToString()需要參數Object[],這是一個基元數組類型不是其子類型的參數。如果你知道你有一個基元數組,你可以簡單地在其上調用Arrays.toString()(因爲基元數組不能「深」),這對於所有基元類型都是重載的。

唯一的另外一種情況是,你有一些可能是原始數組或引用數組的東西,而且你不知道它是哪一個,如果它是一個引用數組,你想遞歸地深度打印它。您可以編寫自己的方法,根據每個基元類型手動檢查對象的類型,如果是,則將其轉換爲正確的類型並在其上調用Arrays.toString(),如果它是引用數組,則投射它到Object[]並呼籲Arrays.deepToString()就可以了。

或者,如果你懶,你可以包裹在任何陣列中的一個附加層,並且做對即Arrays.deepToString()

Arrays.deepToString(new Object[]{$obj}) 

,然後就去掉多餘組括號之後。

相關問題