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

Java 可以在超类中声明一个返回subclass类型对象的方法吗?,java,generics,type-safety,Java,Generics,Type Safety,我有一个叫做计算器的类,它被许多其他类扩展。它有一个名为intern()的方法,其内容如下: public DailyValueCalculator intern() { if (TimeSeriesIterator.containsMatchingCalculator(this)) { TimeSeriesIterator.removeCalculator(this); return TimeSeriesIterator.getMatchingCa

我有一个叫做计算器的类,它被许多其他类扩展。它有一个名为intern()的方法,其内容如下:

   public DailyValueCalculator intern() {
    if (TimeSeriesIterator.containsMatchingCalculator(this)) {
        TimeSeriesIterator.removeCalculator(this);
        return TimeSeriesIterator.getMatchingCalculator(this);
    } else {
        return this;
    }
}
如果我有,比如说,一个叫bc的计算机操作员,我希望能够通过以下方式实习

bc = bc.intern();
现在我不得不说

bc = (BetaCalculator) bc.intern();
有没有办法使intern()方法始终具有调用它的类型的返回类型?如果没有办法做到这一点,有没有不可能的原因

我知道可能的解决方案,但我不满意:

  • 在我编写的每个计算器中重写intern()方法
  • 向intern()方法传递一个类,并让它返回一个T(例如

    T实习生(类返回类型){…}

  • 为DailyValueCalculator指定一个类型(即使其成为DailyValueCalculator),所有子类都需要指定其中T等于子类的类型,然后让intern()返回T


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

    如果自己键入超类,就可以这样做。下面是一个示例:

    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();
            }
    
        }
    
    }
    
    公共抽象类超类{
    公共事务助理实习生(){
    归还本文件;
    }
    公共静态类子类扩展了超类{
    私有void methodOnlyInSubClass(){
    System.out.println(“子类方法”);
    }
    公共方法(){
    子类sub=intern();
    sub.methodOnlyInSubClass();
    }
    }
    }
    
    检查工厂模式和ist变体…对,这是我在上面的解决方案3中想到的--我不想这样做,因为这个计算器对象是API的一部分,我们的客户对java的知识非常有限,如果在创建计算器时要求它们自己键入类,则可能会感到困惑。也许是最好的办法regardless@Accipheran另一种选择是,您可以编写这样的静态方法
    publicstatics intern(S something)
    ,但它是静态的。