The 'doSomething(T[] obj)' method accepts any level of array type object, but unable to dynamically identify the object type regardless of array level.
Based on Test.java, The multiple level array of Integer and String objects are not executed correctly. It returns "doSomething(T[] obj) false" instead of "doSomething(T[] obj) true";
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";
}
}
I would like it to be done dynamically instead of hard coded as below.
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)) {
...
We have no idea in future about the array level.
String[][].class.isInstance(obj)for 2 deep