Java 抽象对象之间的比较会产生不可靠的错误
尽管两个对象是同一个对象,但这会打印false。将Java 抽象对象之间的比较会产生不可靠的错误,java,abstract-data-type,Java,Abstract Data Type,尽管两个对象是同一个对象,但这会打印false。将返回this==n更改为返回this.intType==n.intType会产生错误“找不到符号:变量intType,位置:类型编号的变量n” 我对ADT还相当陌生,并且还在努力解决这个问题,所以如果这是一个简单的问题,请原谅。但是,我不知道为什么它不起作用,也不知道为什么我不能引用n.intType,但我可以this.intType 您的类是NumbersType而不是Numbers,因此您应该在equals方法中键入强制转换a和b。这就是为什
返回this==n
更改为返回this.intType==n.intType
会产生错误“找不到符号:变量intType,位置:类型编号的变量n”
我对ADT还相当陌生,并且还在努力解决这个问题,所以如果这是一个简单的问题,请原谅。但是,我不知道为什么它不起作用,也不知道为什么我不能引用n.intType
,但我可以this.intType
NumbersType
而不是Numbers
,因此您应该在equals方法中键入强制转换a和b。这就是为什么您不能执行n.intType
intTypes
,而不是直接引用。这就是它不起作用的原因NumbersType
而不是Numbers
,因此您应该在equals方法中键入强制转换a和b。这就是为什么您不能执行n.intType
intTypes
,而不是直接引用。这就是它不起作用的原因NumbersType
而不是Numbers
,因此您应该在equals方法中键入强制转换a和b。这就是为什么您不能执行n.intType
intTypes
,而不是直接引用。这就是它不起作用的原因NumbersType
而不是Numbers
,因此您应该在equals方法中键入强制转换a和b。这就是为什么您不能执行n.intType
intTypes
,而不是直接引用。这就是它不起作用的原因您的命名有点混乱,我建议一般研究多态性。
intType
是在NumbersType
上声明的,但是n
是一个Numbers
。所以你不一定能比较它们
现在,您可以做的一件事是在接口上创建一个方法来检索一些值。我说“some”值而不是“the”值,因为其他数字可能是其他实现。这是接口的一个重要方面。如果您有一个Numbers
,您无法知道它实际上是一个NumbersType
。(您可以通过instanceof
了解这一点,但这不是编写接口实现的好方法。接口的声明应该完全指定其交互。)
但首先有一个附带的问题,那就是你宣布了一个超负荷的。您可能打算声明一个覆盖,这是另一回事。为了回答这个问题,我将展示两者的一个示例,并将重载命名为不同的名称
下面是修改后的界面:
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);
}
既然可以检索int,那么就可以在实现类中比较它们了
public interface Numbers {
public int getIntType();
public boolean isIntTypeEqual(Numbers n);
}
您可能需要阅读:
如果您只是在学习这些东西,equals
可能不是您应该尝试实现的方法。这是契约性的,很容易出错
另一个复杂问题是根据接口声明equals:因为equals必须是对称的,所以实现必须以相同的方式覆盖它。否则合同将被破坏。intType
在NumbersType
上声明,但n
是一个Numbers
。所以你不一定能比较它们
现在,您可以做的一件事是在接口上创建一个方法来检索一些值。我说“some”值而不是“the”值,因为其他数字可能是其他实现。这是接口的一个重要方面。如果您有一个Numbers
,您无法知道它实际上是一个NumbersType
。(您可以通过instanceof
了解这一点,但这不是编写接口实现的好方法。接口的声明应该完全指定其交互。)
但首先有一个附带的问题,那就是你宣布了一个超负荷的。您可能打算声明一个覆盖,这是另一回事。为了回答这个问题,我将展示两者的一个示例,并将重载命名为不同的名称
下面是修改后的界面:
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);
}
既然可以检索int,那么就可以在实现类中比较它们了
public interface Numbers {
public int getIntType();
public boolean isIntTypeEqual(Numbers n);
}
您可能需要阅读:
如果您只是在学习这些东西,equals
可能不是您应该尝试实现的方法。这是契约性的,很容易出错
另一个复杂问题是根据接口声明equals:因为equals必须是对称的,所以实现必须以相同的方式覆盖它。否则合同将被破坏。intType
在NumbersType
上声明,但n
是一个Numbers
。所以你不一定能比较它们
现在,您可以做的一件事是在接口上创建一个方法来检索一些值。我说“some”值而不是“the”值,因为其他数字可能是其他实现。这是接口的一个重要方面。如果您有一个Numbers
,您无法知道它实际上是一个NumbersType
。(您可以通过instanceof
来了解这一点,但这不是编写接口实现的好方法