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 一个类型 <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 回答