2

我希望覆盖 int[] 数组的等号。这样以下将是正确的

int[] a = {1,2,3};
int[] b = {1,2,3};
System.out.println(a.equals(b));

有没有办法做到这一点?

4

4 回答 4

5

覆盖equalsof 的方法int[]既不可能也没有必要。您可以使用Arrays.equals(int[], int[])来实现您想要的功能。

int[] a = {1,2,3};
int[] b = {1,2,3};
System.out.println(Arrays.equals(a, b));
于 2012-09-06T03:37:01.987 回答
2

数组是 Java 的低级构造,因此您不能创建子类,因此您不能覆盖方法。但是您可以使用 java.util.List 而不是数组。现代 JRE 在数组和列表方面表现出相同的性能。

于 2012-09-06T03:24:31.863 回答
0

这里的其他答案是正确的,因为您实际上应该只使用Arrays.equals()或切换到使用 aList<Integer>而不是 a int[]

但是,您想要做的几乎可以使用反射和javassist.util.proxy.ProxyFactory. 这是一些或多或少可以解决问题的示例代码:

public static void main(String[] args) throws Exception {
    int[] test = {0, 1, 2, 3};
    int[] empty1 = {};
    int[] empty2 = {};

    Class clss = int[].class;
    ProxyFactory factory = new ProxyFactory();
    factory.setSuperclass(clss);
    factory.setFilter(new MethodFilter() {
         public boolean isHandled(Method m) {
             // ignore finalize()
             return !m.getName().equals("finalize");
         }
     });
    factory.setHandler(new IntArrayEqualsHandler());

    Class newArrayClass = factory.createClass();

    int[] specialArray = (int[])newArrayClass.newInstance();
    System.out.println(empty1.equals(empty2));
    System.out.println(specialArray.equals(empty1));
    System.out.println(specialArray.equals(empty2));
    System.out.println(specialArray.equals(test));
}

private static class IntArrayEqualsHandler implements MethodHandler {
    @Override
    public Object invoke(Object thisObj, Method method, Method original, Object[] params) throws Throwable {
        if (method.getName().equals("equals")) {
            int[] left = (int[])thisObj;
            int[] right = (int[])params[0];
            return Arrays.equals(left, right);
        }
        return original.invoke(thisObj, params);
    }

}

不幸的是,这不起作用,因为在语言int[].class中声明为final,因此即使使用反射也无法扩展它。至少据我所知。您可以使用一些技巧从字段中删除“最终”修饰符,但似乎没有等效的技巧可用于final从整个类中删除修饰符。

如果有这样的事情,您可以使用上面的代码或类似的代码,int[]在运行时生成一个自定义子类,以实现您所需的equals()行为。

真的,虽然这比它的价值更麻烦,尤其是当您开始研究如何在项目的其余部分中实际使用自定义子类时。所以所有的事情都认为你最好使用Arrays.equals()or List<Integer>

于 2012-09-06T04:08:48.887 回答
0

您不能直接覆盖数组上的 equals - 数组是 Java 中的原始构造,您不能覆盖作用于它们的方法或运算符。

您应该考虑使用ArrayLists 而不是数组 - ArrayLists 提供了一个equals()可以按照您的要求工作的实现(以及数组没有的许多其他有用功能,例如向列表添加新元素的能力等)

于 2012-09-06T03:45:41.733 回答