2012-04-26 6 views
0

私は、他の多くのクラスによって拡張されたCalculatorというクラスを持っています。それは次のように読み込むインターン(と呼ばれるメソッド)を持つ:サブクラス型のオブジェクトを返すスーパークラスのメソッドを宣言できますか?

public DailyValueCalculator intern() { 
    if (TimeSeriesIterator.containsMatchingCalculator(this)) { 
     TimeSeriesIterator.removeCalculator(this); 
     return TimeSeriesIterator.getMatchingCalculator(this); 
    } else { 
     return this; 
    } 
} 

私は、たとえば、BCと呼ばれるBetaCalculatorを持っている場合、私はそれインターンにできるようにしたいと思い

bc = bc.intern(); 

を言って私は

bc = (BetaCalculator) bc.intern(); 

を言っているものの、現在インターン()メソッドは、常にそれが呼び出されたタイプの戻り値の型を持っているなるようにそれを作るための方法はありますか?これを行う方法がない場合、それが不可能な理由はありますか?私はと不満足だけれどもを知ってる

考えられる解決策:私は

  • はインターン()メソッドのクラスを渡すと、それは返した書き込みすべての計算はインターン()メソッドを書き換え

    1. Tは、(例えば

      < Tは(クラス< T>戻り値の){...}

    2. DailyValを与えるDailyValueCalculator> Tインターンを拡張しますueCalculator a Type < T>(すなわち、 T.

    3. を返す)(
  • +3

    Factoryパターンとイスト変種をチェック... –

    答えて

    3

    あなた自身でスーパークラスを入力するとできます。次に例を示します。

    public abstract class SuperClass<S extends SuperClass<S>> { 
    
        public S intern() { 
         return (S) this; 
        } 
    
        public static class SubClass extends SuperClass<SubClass> { 
    
         private void methodOnlyInSubClass() { 
          System.out.println("subclass method"); 
         } 
    
         public void myMethod() { 
          SubClass sub = intern(); 
          sub.methodOnlyInSubClass(); 
         } 
    
        } 
    
    } 
    
    +0

    右、これは)私は解決策3として上記念頭に置いていたものだった - 私はこの電卓オブジェクトので、これを行うに希望されませんAPIの一部であり、ほとんどの場合、Javaについての知識が限られているクライアントは、電卓を作成するときにクラスを自分自身で入力する必要がある場合、混乱する可能性があります。これに拘らずに行く最良の方法かもしれません –

    +0

    @Accipheranこれに代わる方法として、この 'public static S intern(S something)'のような静的メソッドを書くことができます。 –

    -1

    をTは、サブクラスの種類に等しいすべてのサブクラスを指定するために必要とされるであろうこと、それはDailyValueCalculator < T>)作り、その後、インターンを持つことなしにこれを行う方法はありません。それについて考えてみましょう:インターンメソッドは同じクラスを返すだけですが、コンパイラはどうすればよいでしょうか?

    関連する問題