可以在返回子类类型的对象的超类中声明一个方法



我有一个名为计算器的类,它被许多其他类扩展。它有一个名为 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() 方法传递 a 类并让它返回一个 T(例如

    T intern(Class returnType){...}

  3. 给 DailyValueCalculator 一个类型
  4. 即将它设为 DailyValueCalculator),所有子类都需要指定其中 T 等于子类的类型,然后让 intern() 返回 T。

如果你用它自己输入你的超类,你可以做到这一点。下面是一个示例:

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

不,没有办法做到这一点。想一想:我知道你知道 intern 方法只会返回相同的类,但编译器怎么可能呢?

最新更新