0

该类java.util.Objects包含deepEquals(Object a, Object b)可用于比较任何类型的对象(包括数组和空引用)的方法,但不包含类似的deepToString(Object o). 这令人失望。(顺便说一下,这个类的私有构造函数包含消息“没有你的 java.util.Objects 实例!”这在一定程度上解释了为什么这个类如此卑鄙)。既然如此,我尝试自己实现该方法:

public static String deepToString(Object o) {
    if (o == null || !o.getClass().isArray())
        return Objects.toString(o);
    else
        return Arrays.deepToString((Object[])o);
}

问题是它不适用于原始类型的一维数组。我是否必须遍历所有带有嵌套else ifs 的原始数组类型并为它们调用相应的Arrays.toString(...)方法,还是有更简单的替代方法?

4

1 回答 1

0

我来到了这个解决方案:将一个原始数组包装到Object[]public 返回的结果中并删除外括号Arrays.deepToString(Object[] a)

public static String deepToString(Object o) {
    if (o == null || !o.getClass().isArray())
        return Objects.toString(o);
    else if (o instanceof Object[])
        return Arrays.deepToString((Object[])o);
    else {
        String s = Arrays.deepToString(new Object[] { o });
        return s.substring(1, s.length() - 1);
    }
}

效率不高,因为它可以创建两个大字符串而不是单个字符串。但是有了这个技巧,我可以使用隐藏的

Arrays.deepToString(Object[] a, StringBuilder buf, Set<Object[]> dejaVu)

包含原始数组解析逻辑的方法。

于 2020-06-14T18:49:07.110 回答