所以,我创建了一个名为Test的简单类,如下所示:
import prog.utili.IntegerB;
//It's a custom class
class Test
{
public static void main(String[] args)
{
IntegerB a = new IntegerB(1);
IntegerB b = new IntegerB(2);
IntegerB sum = a.plus(b);
System.out.println(sum);
}
}
我想练习继承,所以我创建了两个自定义类。分数...
package prog.utili;
public class Fraction
{
private int num;
private int den;
public Fraction(int x, int y)
{
[...]
}
public Fraction(int x)
{
this(x, 1);
}
public Fraction plus(Fraction f)
{
int n = this.num * f.den + this.den * f.num;
int d = this.den * f.den;
return new Fraction(n, d);
}
[...]
}
...和IntegerB:
package prog.utili;
public class IntegerB extends Fraction
{
public IntegerB(int num)
{
super(num);
}
public IntegerB plus(IntegerB other)
{
return (IntegerB)this.plus(other);
}
}
问题是我一直收到同样的错误:
at prog.utili.IntegerB.plus(IntegerB.java:11)
我知道我可以简单地通过删除IntegerB上的最后一个方法并用
替换Test.java的第9行来解决问题IntegerB sum = (IntegerB)a.plus(b)
但我绝对想要使用“plus”方法的继承规则来做到这一点!
答案 0 :(得分:1)
要实施方法plus(IntegerB)
,请调用plus(IntegerB)
,调用plus(IntegerB)
等等,直到收到StackOverflowError。
为您的方法提供实际的实现:
return new IntegerB(this.getNum() + other.getNum());
或
return new IntegerB(super.plus(other).getNum());
另请注意,用
替换Test.java的最后一行IntegerB sum = (IntegerB)a.plus(b);
不会起作用,因为plus()
中的Fraction
方法不会返回IntegerB
,而是返回分数。因此,您将获得ClassCastException。
答案 1 :(得分:0)
这里的问题是IntegerB.plus
没有覆盖Fraction.plus
,它会重载它。这是因为参数类型不同。因此,当IntegerB.plus
调用this.plus(other)
时,它最终调用自身,然后调用自身,然后调用自身,直到获得StackOverflow(从而将您发送到stackoverflow :)。
您似乎想要拨打plus(Fraction)
而不是plus(IntegerB)
。为此,您可以明确地转发other
:
return plus((Fraction) other);
除非告诉编译器您要调用处理Fraction
的plus版本,否则此强制转换无效,即使您知道自己有IntegerB
。
但是,此方法不会返回IntegerB
,而只返回其分母为1的Fraction
。如果分母,您可以设想覆盖plus
以返回IntegerB
结果为1,但这可能会导致a.plus(b)
不等于b.plus(a)
的意外情况,因为一个是Fraction
而另一个是IntegerB
。或者,您可以尽可能从IntegerB
返回Fraction.plus
个对象。