Numbers a,b;
a = new NumbersType(1);
b = new NumbersType(1);
System.out.println(a.equals(b));

public class NumbersType implements Numbers {
    int intType;
    public NumbersType (int q) {
        this.intType = q;
    }
    public boolean equals(Numbers n) {
        return this == n;
    }
}

public interface Numbers {
    public boolean equals(Numbers n);
}


尽管两个对象都是同一对象,但此打印结果为false。将return this == n更改为return this.intType == n.intType会产生错误“找不到符号:变量intType,位置:数字类型的变量n”。

我对ADT还是很陌生,但仍然可以解决这个问题,如果这是一个简单的问题,请原谅。我不确定为什么它不起作用,为什么不能引用n.intType但可以引用this.intType

最佳答案

intType上声明了NumbersType,但nNumbers。因此,您不必将它们进行比较。

现在,您可以做的一件事是在接口上创建一个方法来检索一些值。我说的是'some'值而不是'the'值,因为另一个Numbers可能是其他实现。这是接口的重要方面。如果您有Numbers,则无法知道它实际上是NumbersType。 (您可以使用instanceof找出答案,但这不是编程接口实现的好方法。接口的声明应完全指定其交互。)

但是首先存在一个附带问题,即您声明了Object#equals的重载。您可能打算声明覆盖,这是另一回事。就我的回答而言,我将展示两个示例,并为重载命名不同的名称。

现在是修改后的界面:

public interface Numbers {
    public int getIntType();
    public boolean isIntTypeEqual(Numbers n);
}


现在您可以检索int了,可以在实现类中对其进行比较。

public class NumbersType
implements Numbers {
    private int intType;

    public NumbersType(int intType) {
        this.intType = intType;
    }

    @Override
    public int getIntType() {
        return intType;
    }

    @Override
    public boolean isIntTypeEqual(Number n) {
        return intType == n.getIntType();
    }

    // overriding hashCode because we are overriding equals
    @Override
    public int hashCode() {
        return intType;
    }

    @Override
    public boolean equals(Object o) {
        if(!(o instanceof Numbers))
            return false;

        return isIntTypeEqual((Numbers)o);
    }
}


您可能需要阅读:


Overriding equals and hashCode in Java
Overriding and Hiding Methods


如果您只是在学习这些知识,则equals可能不是您应该尝试实现的方法。它是契约性的,容易出错。

另一个复杂的问题是在接口方面声明了equals:由于equals必须是对称的,因此实现必须相同地重写它。否则,合同将被破坏。

10-06 15:50