在Java中将对象强制转换为特定数组

时间:2011-07-04 15:33:43

标签: java arrays

由于某种原因,我遇到了一些麻烦。

我有两个java对象,它们都可以是任何东西,包括原始和非原始数组。

我需要执行等于检查。

如果它们是数组,那么我必须检查它们的内容而不是它们的运行时实例。

例如,假设我有一个方法:

/**
     * Returns true if the two parameters are arrays, and they both contain
     * the same content.
     * @param aObject1 An object
     * @param aObject2 An object
     * @return
     */
    private boolean equalsArray( Object aObject1, Object aObject2 ) {
      if(aObject1==null){
        return false;
      }
      if(aObject2==null){
        return false;
      }
      if(!aObject1.getClass().isArray()){
        return false;
      }
      if(!aObject2.getClass().isArray()){
        return false;
      }
      //How do I check if the two arrays here contain the same objects
      //without knowledge of their type???

    }

请注意,数组可以是任何数组,很可能不是Object [],而是Foo []或Bar []。

有什么建议吗?我不能做Array.equals(Object [],Object []),因为我无法转换为Object []。

5 个答案:

答案 0 :(得分:2)

使用java.lang.reflect.Array:

    if (Array.getLength(first) != Array.getLength(second))
        return false;

    for (int i = 0; i < Array.getLength(first); ++i) {
        Object firstItem = Array.get(first, i);
        Object secondItem = Array.get(second, i);
        if (!(firstItem == null ? secondItem == null : firstItem.equals(secondItem)))
            return false;
    }
    return true;

答案 1 :(得分:1)

中有一个很好的等于实用程序
boolean org.apache.commons.lang.ArrayUtils.isEquals(Object array1, Object array2)

它会运行这样的东西 - 当然你不想手动编写: - )

public static boolean isEquals(Object array1, Object array2) {
    return new EqualsBuilder().append(array1, array2).isEquals();
}

public EqualsBuilder append(Object lhs, Object rhs) {
    if (isEquals == false) {
        return this;
    }
    if (lhs == rhs) {
        return this;
    }
    if (lhs == null || rhs == null) {
        this.setEquals(false);
        return this;
    }
    Class lhsClass = lhs.getClass();
    if (!lhsClass.isArray()) {
        // The simple case, not an array, just test the element
        isEquals = lhs.equals(rhs);
    } else if (lhs.getClass() != rhs.getClass()) {
        // Here when we compare different dimensions, for example: a boolean[][] to a boolean[] 
        this.setEquals(false);
    }
    // 'Switch' on type of array, to dispatch to the correct handler
    // This handles multi dimensional arrays of the same depth
    else if (lhs instanceof long[]) {
        append((long[]) lhs, (long[]) rhs);
    } else if (lhs instanceof int[]) {
        append((int[]) lhs, (int[]) rhs);
    } else if (lhs instanceof short[]) {
        append((short[]) lhs, (short[]) rhs);
    } else if (lhs instanceof char[]) {
        append((char[]) lhs, (char[]) rhs);
    } else if (lhs instanceof byte[]) {
        append((byte[]) lhs, (byte[]) rhs);
    } else if (lhs instanceof double[]) {
        append((double[]) lhs, (double[]) rhs);
    } else if (lhs instanceof float[]) {
        append((float[]) lhs, (float[]) rhs);
    } else if (lhs instanceof boolean[]) {
        append((boolean[]) lhs, (boolean[]) rhs);
    } else {
        // Not an array of primitives
        append((Object[]) lhs, (Object[]) rhs);
    }
    return this;
}

答案 2 :(得分:0)

您可以使用

  Arrays.equals(Object[] a, Object[] a2)

但是,您必须实现内容的等于,因为该方法具有:

 o1.equals(o2)

只有在为该对象实现equals时才会有效。

对于非原始类型,有一个

 Arrays.equals

覆盖每种基本类型。

答案 3 :(得分:0)

您可以使用Arrays.equal(..),或者,如果数组可以有嵌套数组Arrays.deepEquals(..)

答案 4 :(得分:0)

怎么样:

if(aObject1.getClass().getName().equals(aObject2.getClass().getName()))
return Arrays.equals(aObject1, aObject2);
else return false;