如何识别多级数组对象类类型而不管数组级别?

时间:2016-02-12 09:04:07

标签: java

' 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)) {
        ...

我们将来不知道阵列级别。

2 个答案:

答案 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";
}