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,location:类型为数字的变量n”。
我是ADT的新手并且还在绕过它,所以请原谅我这是一个简单的问题。我不确定为什么它不起作用,为什么我不能引用n.intType
但我可以this.intType
。
答案 0 :(得分:2)
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);
}
}
您可能需要阅读:
如果您刚学习这些内容,equals
可能不是您应该尝试实施的方法。这是契约性的,容易出错。
另一个复杂因素是在接口方面声明等于:因为equals必须是对称的,实现必须相同地覆盖它。否则合同就会破裂。
答案 1 :(得分:1)
您的课程为NumbersType
而不是Numbers
,因此您应该在等号方法中输入cast a和b。这就是你不能做n.intType
键入强制转换后,您的equals方法应该比较对象的intTypes
,而不是直接引用。这就是为什么它不起作用的原因。
你的命名有点令人困惑,我建议一般研究多态性。