0

私は Calculator というクラスを持っています。これは他の多くのクラスによって拡張されています。次のような intern() というメソッドがあります。

   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();

intern() メソッドが常に呼び出された型の戻り値の型を持つようにする方法はありますか? また、これを行う方法がない場合、それが不可能な理由はありますか?

私が知っているが、満足していない可能な解決策:

  1. 私が書くすべての電卓の intern() メソッドを書き直す
  2. intern() メソッドに Class を渡し、T を返すようにする (例:

    <T extends DailyValueCalculator> T intern(Class<T> returnType){...}

  3. DailyValueCalculator に Type <T> を与える (つまり、DailyValueCalculator<T> にする) すべてのサブクラスは、T がサブクラスの型と等しい場所を指定し、intern() が T を返すようにする必要があります。

4

2 に答える 2

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();
        }

    }

}
于 2012-04-26T16:05:46.513 に答える
-1

いいえ、これを行う方法はありません。考えてみてください: intern メソッドが同じクラスを返すだけであることは知っていますが、コンパイラはどうすればよいのでしょうか?

于 2012-04-26T16:04:22.160 に答える