【问题标题】:Arrays - check if object is an array数组 - 检查对象是否为数组
【发布时间】:2016-12-01 07:39:14
【问题描述】:

在我的代码中某处我有以下功能:

private static Object formatArg(Object arg)
{
    Object formatterArg;
    if (arg instanceof Collection)
        formatterArg = getFormatter().format((Collection) arg, mFormatters);
    else if (arg instanceof Object[])
        formatterArg = getFormatter().format((Object[]) arg, mFormatters);
    else
        formatterArg = getFormatter().format(arg, mFormatters, false);

    return formatterArg;
}

问题是这个arg instanceof Object[]。这样做的目标是我想处理int[]long[] 以及任何原始数组。

问题

是否有可能找出 Object 是一个数组,无论是哪种类型,并将其传递给另一个函数?这应该适用于原始类型的数组以及Objects 的数组...我可以使用arg != null && arg.getClass().isArray() 来检查它Object 是一个数组,但是我不知道如何传递它(因为我不能只是将int[] 转换为Object[]...)。有什么技巧可以实现我想要的吗?

编辑

一个漂亮的解决方案会自动将int[] 转换为Integer[],将long[] 转换为Long[] 等等。这些转换后的数组可以与我的instanceof Object[] 一起使用,但这意味着我必须手动检查这些原始类型,我可以这样做,但这很难看。有更好的想法吗?

【问题讨论】:

  • getFormatter()返回什么类型?
  • int[] 和其他原始类型不是对象数组,因此类型转换本身会失败。您必须先将它们转换为 Integer[] 或 Long[]
  • 我知道(我什至在我的问题中使用了这个功能!)。但是我不能自动将int[] 转换为Integer[],然后我可以将其交给我的格式化程序。因此,我必须一个一个地处理所有原始类型,这并不难,但我想避免它,也许有人知道一个漂亮的解决方案
  • "因为我不能只将 int[] 转换为 Object[]" - 似乎您需要原始数组 format(int[], ...) 的格式特化等等。

标签: java arrays


【解决方案1】:

获取对象数组的快速练习

public static void main(String[] args) {
    int[] arrInt = {23, 45, 67, 89};
    long[] arrLong = {23, 45, 67, 89};
    System.out.println(convertarrObj(arrInt));
}

static Object[] convertarrObj(Object arrObj){
    if(arrObj.getClass().isArray()) {
        Object[] objArray = new Object[Array.getLength(arrObj)];
        for(int i = 0; i < Array.getLength(arrObj) ; i++) {
            objArray[i] = Array.get(arrObj, i);
        }
        return objArray;
    }

    return null;
}

并且可以很容易地确保返回一个整数或长整数或任何其他类型的数组

static Object[] convertarrObj(Object arrObj){
    Object[] objArrayObjects = null;
    if(arrObj instanceof Collection)
        return null;
    else if(arrObj.getClass().isArray()) {
        Object firstElement = Array.get(arrObj, 0);
        if (firstElement instanceof Integer) {
            objArrayObjects = new Integer[Array.getLength(arrObj)];
        } else if(firstElement instanceof Long) {
            objArrayObjects = new Long[Array.getLength(arrObj)];
        }
        for(int i = 0; i < Array.getLength(arrObj) ; i++) {
            objArrayObjects[i] = Array.get(arrObj, i);
        }
    }

    return objArrayObjects;
}

这背后的逻辑是在 Java 中原始数据类型和相应类之间的自动包装。 Determine Type of Primitive data type

【讨论】:

  • 和我要找的一模一样,我试试看
  • @prom85,更新了我添加的第二种方法,返回整数数组或长数组。正确地说,你帮助获得了最终的逻辑。我很确定您将能够想到更好的逻辑,并且可能避免一次迭代来读取数组的元素。
  • 您忘记检查数组的长度 == 0... 但是对于我的用例,第一件事正是我正在寻找的,一种一次处理所有原始类型的好方法.. . 或者,为了避免反射,isArray 调用甚至可以替换为:if (arg instanceof boolean[] || arg instanceof byte[] || arg instanceof short[] || arg instanceof char[] || arg instanceof int[] || arg instanceof long[] || arg instanceof float[] || arg instanceof double[])...
  • 当您只需要定义 private static Object formatArg(int[] arg) 来专门化行为时,我不明白创建新对象的必要性。
  • 是的,但想法是将对象传递给 convertarrObj 并且事先不知道它是一个数组。此外,此解决方案只是提供一种方法来满足 OP 的需求,而不是本身就是一个完美的解决方案。在阅读了 OP 的问题后,我意识到自己非常有能力清楚地编写代码来实现他所需要的,并且只是在寻求一个合适的方向而不是一个完美的解决方案
【解决方案2】:

是的,您可以使用:

arg.getClass().isArray()

这里是associated Javadoc - 您还可以找到帮助您确定数组的组件类型的方法,这可能对您的代码也很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多