可以在超类中声明一个返回类型为subclass的对象的方法吗?

时间:2012-04-26 15:58:54

标签: java generics type-safety

我有一个名为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.

2 个答案:

答案 0 :(得分: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();
        }

    }

}

答案 1 :(得分:-1)

没有办法做到这一点。想想看:我知道你知道实习方法只会返回同一个类,但编译器怎么可能?