这是一个分数计划。我有私人的ints num和den,Fraction和FractionInterface - 标准的家庭作业问题。我已经做了很多事情,现在已经在equals方法上停留了几个小时。由于其他是一个对象,我不能把它等同于Fraction。这就是我所拥有的:
public boolean equals(Object other){
if (other == this){
return true;
} else {
return false;
}
}
这会编译,但结果不正确:
1/2 eq 1/2 = true
1/2 eq 1/2 = true
1/2 eq 1/2 = false
1/2 eq 1/2 = false
如果我尝试其他== Fraction,它就不会编译。谢谢你的帮助!
答案 0 :(得分:2)
您可以测试other
是FractionInterface
的实例并使用演员:
public boolean equals(Object other){
if (other == this){
return true;
} else if (other instanceof FractionInterface) {
FractionInterface fOther = (FractionInterface) other;
// compare numerator and denominator...
} else {
return false;
}
}
请注意,如果instanceof
,false
将为other == null
,因此无需单独进行空检查。
答案 1 :(得分:1)
试试这个:
首先,转换other
对象
Fraction otherFraction = (Fraction) other;
然后,确定两个部分相等的条件。
这将包括一些涉及分子和分母比较的逻辑(期望getNum()
使用getDen()
和otherFraction
。
答案 2 :(得分:1)
您应该检查参数是否是您的类的实例,如果不是,则返回false
并将其投射到您的班级,并根据您的需要进行比较。这样编写equals()
方法很常见:
public boolean equals(Object obj) {
if (!(obj instanceof Fraction)) {
return false;
}
Fraction that = (Fraction) obj;
... // Your algorithm to compare two fractions: this and that.
}
您应该确保用于比较两个分数的算法符合equals()
documentation中描述的所有要求。
答案 3 :(得分:0)
您需要测试对象是否具有Fraction类,如果是,则将其强制转换为Fraction:
if (other.getClass() != Fraction.class) {
return false;
}
Fraction otherFraction = (Fraction) other;
// compare the fields of this and otherFraction
在此之前,请务必测试null。
答案 4 :(得分:0)
您正在比较两个对象引用是指同一个对象。
您需要检查other
是否为Fraction
类型,然后输入转换为Fraction
。然后,您将比较Fraction
的两个部分。
答案 5 :(得分:0)
我认为你很接近,但你错过了几个关键概念。这是因为你的原则并不适用于所有情况。例如,使用现有代码尝试此操作......
Fraction a = // this is however you're making a fraction object...
Fraction b = // do EXACT same thing here that you did for a
// And then, this will illustrate what is wrong with your program...
if(a.equals(b)) {
System.out.println("This won't print");
} else {
System.out.println("This will print because your method just checks for reference");
}
以下是您需要了解的基础知识:
==
和equals
首先关闭......
public boolean equals(Object other){
if (other == this){
return true;
} else {
return false;
}
}
你错过了Java中“equals”方法的观点。 ==
用于比较引用,this.equals(foo)
用于放置用于比较本地化对象的逻辑。
您缺少的另一个概念是应该如何使用instanceof。当你问这个......
如果我尝试其他== Fraction,则无法编译。
这是因为您希望比较对象的类型。要做到这一点,你只需要......
if(other instanceOf Fraction) {
// do stuff...
}
所有这一切,都有最后一个概念,即将等于定义放在适当的位置。你需要把它放在你的Fraction类中并像这样定义它......
public boolean equals(Fraction other) {
// do something like this (you will have to define toDouble)
if(this == other || this.toDouble() == other.toDouble()) {
return true;
}
return false;
}
这将覆盖默认值...
public boolean equals(Object other) {/* ... */}
它会非常方便。以下是一些示例代码...
Fraction fractionA = new Fraction("2/4");
Fraction fractionB = new Fraction("1/2");
Fraction fractionC = new Fraction("1/3");
Object trollObject = new Object();
// And then call random equals objects...
if(fractionA.equals(fractionB)) {
// should be true...
}
if(fractionB.equals(fractionA)) {
// should be true...
}
// This avoids having to do any casting because
// since you've only defined a Fraction.equals(Fraction) method
// it should instead default to the Object.equals method
if(trollObject.equals(fractionB)) {
}
答案 6 :(得分:0)
这是一个非常标准的模式:
public boolean equals(Object other) {
if (other == this) return true;
if (other == null) return false;
if (other.getClass() != this.getClass()) return false;
Fraction o = (Fraction) other;
// now you compare their num, den, and possibly sign
}
如果我们应该使用getClass()
或instanceof
,人们可能会争辩。只有当Fraction
被扩展时才重要,它取决于扩展时你想要什么。请记住,equals()
a.equals(b)
的合同应该与b.equals(a)
获得相同的结果,如果两者都不是null
,并且子类可能有不同的equals()
这可能会违反合同。
答案 7 :(得分:-1)
==运算符比较对象的哈希码。这就是你的方法不正确的原因,你应该这样写:
public boolean equals(Object other){
if (other instanceof Fraction){
return ((Fraction)other).getNum == this.num && ((Fraction)other).getDen == this.den;
} else {
return false;
}
}
答案 8 :(得分:-1)
我希望它会对你有帮助。试试这段代码。
import java.io.*;
class Cast
{
public static void main(String args[]) throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
byte a=20;
short s=31468;
int i=12345678;
char c=’c';
float f=3.56f;
//Widening or promotion [java question bank][1]
System.out.println(“a=(short) “+(short) a);
System.out.println(“a=(int) “+(int) a);
System.out.println(“a=(long) “+(long)a);
System.out.println(“a=(float) “+(float)a);
System.out.println();
System.out.println();
System.out.println(“s=(int) “+(int)s);
System.out.println(“s=(long) “+(long)s);
System.out.println(“s=(float) “+(float)s);
System.out.println();
System.out.println();
System.out.println(“i=(long) “+(long)i);
System.out.println(“i=(float) “+(float)i);
System.out.println(“i=(double) “+(double)i);
//Narrowing using [java question bank][2]
System.out.println(“f=(byte) “+(byte)f);
System.out.println(“f=(short) “+(short)f);
System.out.println(“f=(char) “+(char)f);
System.out.println(“f=(long) “+(long)f);
System.out.println();
System.out.println();
System.out.println(“i=(byte) “+(byte)i);
System.out.println(“i=(short) “+(short)i);
System.out.println();
System.out.println();
System.out.println(“s=(byte) “+(byte)s);
}
}