继承类分数/整数

时间:2012-12-17 22:20:02

标签: java inheritance runtime-error

所以,我创建了一个名为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”方法的继承规则来做到这一点!

2 个答案:

答案 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个对象。