Array.equal() 输出错误

Array.equal() giving wrong output

根据我的理解,下面的代码应该打印 true,因为两个元素都是 equal.

来自 java 文档 Array.get() 将 return:

Returns the value of the indexed component in the specified array object. The value is automatically wrapped in an object if it has a primitive type.

但是,当我 运行 下面的代码正在打印时 false:

  public class Test1 {

    static boolean equalTest(Object array1, Object array2) {
        return Array.get(array1, 0).equals(Array.get(array2, 0));
    }

    public static void main(String[] args) {
        int[] a = new int[1];
        byte[] b = new byte[1];
        a[0] = 3;
        b[0] = 3;
        System.out.println(equalTest(a, b));
    }
}

我的问题是 类 实施 Number 是否或应该直接相互比较。

数组数据类型不匹配。一个是 int,另一个是 byte。由于它们作为对象传递给函数,因此它们最终将成为 IntegerByte。因此,为了正确比较它们,您需要将它们强制转换为同一类型。类似于:

static boolean equalTest(Object array1, Object array2) {
  int int1 = (int) Array.get(array1, 0);
  int int2 = (int) Array.get(array2, 0);
  return int1.equals(int2);
  // OR return int1 == int2;
}

这真的与数组无关。您的比较相当于:

Object x = Integer.valueOf(3);
Object y = Byte.valueOf((byte) 3);
boolean equal = x.equals(y);

那永远不会 return true

即使您的原始数组是基本类型,Array.get returns Object,所以您得到的是盒装类型 - 并比较这些不同类型的值。

问题是 Array.get() 方法 return 是一个对象,因此对于 int 它将 return Integer,对于 byte,它将return Byte。所以 .equals() 方法将 return false 因为它首先查看类型是否相同,然后比较值。

Array.get 调用 return IntegerByte 对象实例。根据 Integer.equals,它们不相等,因为 class 类型不同。

根据 documentation of Array.get(Object array,int index) 方法,如果返回值具有基本类型,则返回值会自动包装在对象中。因此,如果您添加以下行:

System.out.println(Array.get(array1, 0).getClass());
System.out.println(Array.get(array2, 0).getClass());

你会看到输出是

class java.lang.Integer
class java.lang.Byte

Integerclass的equals方法首先检查它所比较的​​对象是否也是Integer的实例,如果不是,则不需要进一步检查,它们不相等。 这就是您看到输出为 false 的原因,因为比较对象是 IntegerByte.

如果您查看 Array.get 的 JavaDoc,您会看到:

The value is automatically wrapped in an object if it has a primitive type.

所以你的 byte 变成了 Byte,你的 int 变成了 Integer

这意味着您调用的函数是 Integer.equals(Object)

这是这样实现的:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

您没有传递 Integer,而是传递 Byte,所以它 returns 为假。