[英]How to cast generic object as primitive array?
一維基本數組在通用方法上無法正常工作。 新的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);
}
}
}
你不能 Arrays.deepToString()
采用參數Object[]
,它不是基元數組類型的子類型。 如果您知道有一個原始數組,則只需在其上調用Arrays.toString()
(因為原始數組不能為“深”),這對於所有原始數組類型都是重載的。
唯一的另一種情況是,您擁有的東西可能是基元數組或引用數組,並且您不知道哪一個,如果是引用數組,則需要深度遞歸打印。 您可以編寫自己的方法來針對每種原始數組類型手動檢查對象的類型,如果是,則將其Arrays.toString()
轉換為正確的類型,並在其上調用Arrays.toString()
,如果它是一個數組引用,將其轉換為Object[]
並對其調用Arrays.deepToString()
。
或者,如果您很懶惰,則可以將任何內容包裝在數組的另一層中,然后Arrays.deepToString()
進行Arrays.deepToString()
:
Arrays.deepToString(new Object[]{$obj})
然后再去掉多余的一組括號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.