[英]Comparison between abstract objects yields wonky error
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,位置:类型为Numbers的变量n”。
我对ADT相当陌生,但仍然可以解决这个问题,如果这是一个简单的问题,请原谅。 我不确定为什么它不起作用,为什么我不能引用n.intType
但我可以this.intType
。
intType
在NumbersType
上声明,但n
是Numbers
。 因此,您不必将它们进行比较。
现在,您可以做的一件事就是在接口上创建一个方法来检索一些值。 我说“一些”值而不是“ 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:因为equals必须是对称的,所以实现必须相同地重写它。 否则,合同将被破坏。
您的类是NumbersType
而不是Numbers
,因此您应该在equals方法中键入强制转换a和b。 这就是为什么您不能执行n.intType
键入intTypes
后,您的equals方法应该比较对象的intTypes
,而不是直接引用。 这就是为什么它不起作用的原因。
您的命名有些混乱,我建议您一般学习多态性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.