' doSomething(T [] obj)'方法接受任何级别的数组类型对象,但无论数组级别如何都无法动态识别对象类型。
基于Test.java,Integer和String对象的多级数组未正确执行。它返回" doSomething(T [] obj)false"而不是" doSomething(T [] obj)true&#34 ;;
Test.java:
/*
Actual Output:
Integer: doSomething(T obj) true
Integer[]: doSomething(T[] obj) true
Integer[][]: doSomething(T[] obj) false
String: doSomething(T obj) true
String[]: doSomething(T[] obj) true
String[][]: doSomething(T[] obj) false
Expected Output:
Integer: doSomething(T obj) true
Integer[]: doSomething(T[] obj) true
Integer[][]: doSomething(T[] obj) true
String: doSomething(T obj) true
String[]: doSomething(T[] obj) true
String[][]: doSomething(T[] obj) true
*/
public class Test {
public static void main(String[] args) throws Exception {
System.out.println("0: " + doSomething(new Integer(1)));
System.out.println("1: " + doSomething(new Integer[]{}));
System.out.println("2: " + doSomething(new Integer[][]{}));
System.out.println("0: " + doSomething(new String("")));
System.out.println("1: " + doSomething(new String[]{}));
System.out.println("2: " + doSomething(new String[][]{}));
}
public static <T> String doSomething(T obj) {
if (Number.class.isInstance(obj)) {
/*
do something
*/
return "doSomething(T obj) true";
} else if (String.class.isInstance(obj)) {
/*
do something
*/
return "doSomething(T obj) true";
}
return "doSomething(T obj) false";
}
public static <T> String doSomething(T[] obj) {
if (Number[].class.isInstance(obj)) {
/*
do something regardless of array deep
*/
return "doSomething(T[] obj) true";
} else if (String[].class.isInstance(obj)) {
/*
do something regardless of array deep
*/
return "doSomething(T[] obj) true";
}
return "doSomething(T[] obj) false";
}
}
我希望动态完成,而不是硬编码,如下所示。
if (Number[].class.isInstance(obj)) {
/*
do something
*/
return "doSomething(T[] obj) true";
} else if (Number[][].class.isInstance(obj)) {
/*
do something
*/
return "doSomething(T[] obj) true";
} else if (Number[][][].class.isInstance(obj)) {
...
我们将来不知道阵列级别。
答案 0 :(得分:3)
在这两种情况下(#2)Integer[][]
都不是Number[]
类型(String[][]
不是String[]
),因此您的程序会为您提供正确的结果。
为什么会这样?因为实际上Integer[][]
类型声明了一个数组类型,哪些元素属于Integer[]
类型,但它本身不是 Integer[]
。
所以,如果你想“抓住”你必须添加的东西:
} else if (Integer[][].class.isInstance(obj)) {
和
} else if (String[][].class.isInstance(obj)) {
条件,或只是单} else if (Object[][].class.isInstance(obj)) {
。
更新:正如您在评论中所写,您希望能够使用任意维度的数组。在这种情况下,这样的想法可以帮助你:
} else if (Object[][].class.isInstance(obj)) {
for (T[] subArray : (T[][])obj) {
doSomething(subArray);
}
/*
do something regardless of array deep
*/
return "doSomething(T[] obj) true";
}
答案 1 :(得分:-1)
将此添加到您的代码中:
public static <T> String doSomething(T[][] obj) {
if (Number[][].class.isInstance(obj)) {
return "doSomething(T[][] obj) true";
} else if (String[][].class.isInstance(obj)) {
return "doSomething(T[][] obj) true";
}
return "doSomething(T[][] obj) false";
}