如何处理可能是也可能不是数组的Java对象,可能是也可能不是基元数组

时间:2013-01-09 21:56:57

标签: java arrays casting

我正在编写一些适用于JMX api的代码。具体来说,我正在使用getAttribute

MBeanServerConnection方法

getAttribute方法的javadocs表示它返回Object,但我发现根据MBean,有时它会返回Object,有时它可以返回Object[]数组。

因为我想要始终如一地处理getAttribute的回复,所以我写了以下代码:

Object attr = mBeanServer.getAttribute(objName, attributeName);
Object[] attributes = new Object[]{};

if (attr.getClass().isArray()) {
    attributes = (Object[])attr; // create my array by casting the return from getAttribute
} else {
    attributes = new Object[] {attr}; // create my array with just one element
}

for (int i=0; i < attributes.length; i++) {
    // deal with each attribute ...
}

希望你能看到这个想法。这可能是一个天真的解决方案,但基本上我想要始终如一地处理来自getAttribute的回报,无论它是单个Object还是Object[]数组。

以上作品......大部分内容! ...但我现在发现了一个'getAttribute'返回long数组(原语,而不是类)的情况。因此,我的演员抛出java.lang.ClassCastException: [J cannot be cast to [Ljava.lang.Object;

我理解异常 - 它无法将long数组转换为Object数组 - 但我不知道如何解决它。

就个人而言,我认为getAttribute的方法签名很糟糕!返回“对象”以覆盖几乎任何东西 - 一个对象,一组对象或一组基元 - 对我来说就像一个警察。但它不是我的api,我必须使用它。

欣赏有关如何解决这个问题的想法或想法?

干杯

2 个答案:

答案 0 :(得分:1)

if (o instanceof int[]) {
   ...
}
else if (o instanceof boolean[]) {
   ...
}
...

也许有一些更优雅的解决方案,但你不知道你想用该属性做什么。

答案 1 :(得分:1)

这个怎么样?

import java.lang.reflect.*;
import java.util.*;

public class ArrayTest
{ 
  public static void main(String[] args)
  {
    evaluate("Hello");
    evaluate(new Boolean[]{Boolean.TRUE, Boolean.FALSE});
    evaluate(new int[]{0, 1, 2});
    evaluate(null);
  }

  public static void evaluate(Object object)
  {
    List<String> primitiveArrayTypes = Arrays.asList(new String[] {
        "boolean[]", "byte[]", "char[]", "double[]",
        "float[]", "int[]", "long[]", "short[]"
    });

    if (object == null)
    {
      System.out.println("Null object.");
      return;
    }

    Class objClass = object.getClass();

    if (objClass.isArray())
    {
      if (primitiveArrayTypes.contains(objClass.getCanonicalName()))
      {
        System.out.println("Contents of primitive array:");
        for (int i = 0; i < Array.getLength(object); i++)
        {
          System.out.println(Array.get(object, i));
        }
      }
      else
      {
        System.out.println("Contents of Object array:");
        for (Object obj : (Object[]) object)  // cast should now always work
        {
          System.out.println(obj);
        }
      }
    }
    else
    {
      System.out.println("Not an array: " + object);
    }
    System.out.println("---");
  }
}