0

そこで、次のように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);
   }
}

継承を使って練習したかったので、2つのカスタムクラスを作成しました。分数..。

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」メソッドよりも継承ルールを使用してそれを実行したいと思います。

4

2 に答える 2

1

メソッドを実装するには、StackOverflowErrorが発生するまで、などを呼び出しplus(IntegerB)ます。plus(IntegerB)plus(IntegerB)

メソッドの実際の実装を提供します。

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が発生します。

于 2012-12-17T22:33:40.947 に答える
0

ここでの問題は、IntegerB.plusオーバーライドせずFraction.plus、オーバーロードすることです。これは、引数のタイプが異なるためです。したがって、をIntegerB.plus呼び出すとthis.plus(other)、それ自体を呼び出すことになり、次に自分自身を呼び出し、StackOverflowを取得するまで自分自身を呼び出します(したがって、stackoverflowに送信されます:))。

plus(Fraction)の代わりに電話をかけたいようですplus(IntegerB)。これを行うには、明示的にアップキャストできますother

return plus((Fraction) other);

Fractionこのキャストは、を持っていることがわかっていても、sを処理するplusのバージョンを呼び出したいことをコンパイラーに通知する以外の効果はありませんIntegerB

ただし、このメソッドは、を返しませんが、分母が1IntegerBのaだけを返します。結果の分母が1の場合は、Fractionオーバーライドplusしてを返すことができますが、それは、1がしばらくの間であるために等しくないIntegerBという予期しない状況につながる可能性があります。もう1つはです。または、可能な場合はからオブジェクトを返すこともできます。a.plus(b)b.plus(a)FractionIntegerBIntegerBFraction.plus

于 2012-12-18T02:41:26.677 に答える