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
,但n
是Numbers
。因此,您不必将它们进行比较。
现在,您可以做的一件事是在接口上创建一个方法来检索一些值。我说的是'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必须是对称的,因此实现必须相同地重写它。否则,合同将被破坏。