如何在java中识别多维对象的实例?

时间:2014-11-18 08:43:57

标签: java multidimensional-array instanceof

有没有其他方法来识别没有硬编码的多维对象的实例?

//source
import java.util.LinkedList;
import java.util.List;

public class Test {

    public static <T> boolean isPrimitiveWrapper(T p_obj) throws Exception {
        if (Number.class.isInstance(p_obj) || Number[].class.isInstance(p_obj)) {
            return true;
        } else if (Boolean.class.isInstance(p_obj) || Boolean[].class.isInstance(p_obj)) {
            return true;
        } else if (Character.class.isInstance(p_obj) || Character[].class.isInstance(p_obj)) {
            return true;
        }

        return false;
    }

    public static void main(String[] args) throws Exception {
        Integer[][][] a = {{{0}}, {{1}}, {{0}}};

        println(isPrimitiveWrapper(a));
        println(isPrimitiveWrapper(a[0]));
        println(isPrimitiveWrapper(a[0][0]));
        println(isPrimitiveWrapper(a[0][0][0]));
    }

    public static <T> void println(T p_t) {
        System.out.println(p_t);
    }

}

//Actual Result
false
false
true
true

//Expected Result
true
true
true
true

基于上面的例子,我们没有问题来处理非阵列&amp;单维数组对象,但无法识别多维数组对象。

硬编码维数太​​难了。

3 个答案:

答案 0 :(得分:1)

没有标准的方法来确定,如果类本身是原始类型的包装器,那么,你可以这样做:

private static final Set <Class <?>> primitiveWrappers;

static {
    Set <Class <?>> tmp = new HashSet<>();
    tmp.add (Integer.class);
    tmp.add (Boolean.class);
    tmp.add (Character.class);
    tmp.add (Long.class);
    tmp.add (Double.class);
    tmp.add (Float.class);
    // ... have I forgotten smth?
    primitiveWrappers = Collections.unmodifiableSet(tmp);
}

private static boolean isPrimitiveWrapperOrArrayOf(Object o) {
    if (o.getClass().isArray())
        return isPrimitiveWrapperOrArrayOf(o.getClass().getComponentType());
    else
        return primitiveWrappers.contains(o.getClass());
}

当您运行isPrimitiveWrapperOrArrayOf时,正在检查该类是否为数组,如果是,我们将检查它的组件类型(例如,它将是Integer [] for Integer [] [])在同一个函数isPrimitiveWrapperOrArrayOf中,所以这样我们只会SomeClass来检查它是否包含在硬编码的primitiveWrappers内{1}}

顺便说一下,你可以看看Commons Lang,ClassUtils.wrapperToPrimitive可以解决你的问题。

答案 1 :(得分:0)

尝试这种方法。我猜这就是你想要的。
但无论如何,这段代码看起来像某种黑客 (这不一定是坏事)。

private static boolean isPrimitiveWrapper(Object obj){
    if (obj == null) {
        return false;
    } else {
        String cls = obj.getClass().getCanonicalName();
        return "java.lang.Integer".equals(cls) || 
               cls.startsWith("java.lang.Integer[]");
    }
}

这是另一个黑客。两个代码应该可以正常工作。

private static boolean isPrimitiveWrapper(Object obj){
    if (obj == null) {
        return false;
    } else {
        String cls = obj.getClass().getName();
        cls = cls.replaceAll(";", "");
        return cls.matches("\\[*L?java\\.lang\\.Integer");
    }
}

答案 2 :(得分:0)

public class Test {

    public static <T> boolean isPrimitiveWrapper(T p_obj) throws Exception {
        return isPrimitiveWrapper(p_obj.getClass());
    }

    public static boolean isPrimitiveWrapper(Class p_obj) throws Exception {
        if (Number.class.isAssignableFrom(p_obj)) {
            return true;
        } else if (Boolean.class.isAssignableFrom(p_obj)) {
            return true;
        } else if (Character.class.isAssignableFrom(p_obj)) {
            return true;
        } else if (p_obj.isArray()) {

            //To handle multi dimension array
            while (p_obj.isArray()) {
                p_obj = p_obj.getComponentType();
            }

            return isPrimitiveWrapper(p_obj);
        }

        return false;
    }

    public static boolean isPrimitiveWrapper(boolean p_obj) {
        return false;
    }

    public static boolean isPrimitiveWrapper(byte p_obj) {
        return false;
    }

    public static boolean isPrimitiveWrapper(short p_obj) {
        return false;
    }

    public static boolean isPrimitiveWrapper(float p_obj) {
        return false;
    }

    public static boolean isPrimitiveWrapper(int p_obj) {
        return false;
    }

    public static boolean isPrimitiveWrapper(long p_obj) {
        return false;
    }

    public static boolean isPrimitiveWrapper(char p_obj) {
        return false;
    }

    public static boolean isPrimitiveWrapper(double p_obj) {
        return false;
    }

    public static void main(String[] args) throws Exception {
        Integer[][][] a = {{{0}}, {{1}}, {{0}}};
        int[][][] b = {{{0}}, {{1}}, {{0}}};

        println(isPrimitiveWrapper(a));
        println(isPrimitiveWrapper(a[0]));
        println(isPrimitiveWrapper(a[0][0]));
        println(isPrimitiveWrapper(a[0][0][0]));

        println(isPrimitiveWrapper(b));
        println(isPrimitiveWrapper(b[0]));
        println(isPrimitiveWrapper(b[0][0]));
        println(isPrimitiveWrapper(b[0][0][0]));
    }

    public static <T> void println(T p_t) {
        System.out.println(p_t);
    }

}