Java 扩展泛型

Java 扩展泛型,java,generics,inheritance,polymorphism,Java,Generics,Inheritance,Polymorphism,我有一个抽象类 public abstract class Integrator { public abstract Point integrate(); public abstract Point function(Double x, Point y); } 扩展为 public abstract class Euler extends Integrator { public Point integrate() { ... // this calls

我有一个抽象类

public abstract class Integrator {
    public abstract Point integrate();
    public abstract Point function(Double x, Point y);
}
扩展为

public abstract class Euler extends Integrator {
    public Point integrate() {
        ... // this calls function(x, y)
    }
}

public abstract class Central extends Integrator {
    public Point integrate() {
        ... // this calls function(x, y)
    }
}
两者的实现方式不同。现在,我实例化的具体类的定义如下

public class EulerIVP extends Euler {
    public EulerIVP(...) { ... }

    public Point function(Double x, Point y) {
        ...
    }
}

public class CentralIVP extends Central {
    public CentralIVP(...) { ... }

    public Point function(Double x, Point y) {
        ...
    }
}
两者实现函数的方式完全相同,但将使用其父级的集成。因为Euler和Central是抽象的,所以它们都扩展IVP类是没有意义的。所以我希望我能做这样的事情

public class IVP<T extends Integrator> extends T {
    public IVP(...) { ... }
    public Point function(Double x, Point y) { ... }
}

Integrator eulerIntegrator = new IVP<Euler>(...);
Integrator centralIntegrator = new IVP<Central>(...);

但我不能,因为,我相信,这将是一种类型,而不是一个类。我能做些类似的事情吗?

你可以用合成而不是继承。比如:

public class IVP {
    private Integrator integrator;

    public IVP(Integrator integrator) {
        this.integrator = integrator;
    }

    public Point function(Double x, Point y) {
        // Calculate using integrator.integrate();
    }
}
然后将euler设置为非抽象类:

IVP eulerIVP = new IVP(new Euler());

您可以使用组合而不是继承。比如:

public class IVP {
    private Integrator integrator;

    public IVP(Integrator integrator) {
        this.integrator = integrator;
    }

    public Point function(Double x, Point y) {
        // Calculate using integrator.integrate();
    }
}
然后将euler设置为非抽象类:

IVP eulerIVP = new IVP(new Euler());

如果所有函数都是相同的,为什么不在Integrator中实现它呢?只有在这个特定示例中是相同的。我可以有另一个扩展Euler的类,但它有一个不同的函数。我想你可以使用来解决这个问题。如果函数对所有人都是一样的,为什么不在Integrator中实现它呢?它只对这个特定的例子是一样的。我可以有另一个扩展Euler的类,但是有一个不同的函数。我想你可以使用来解决这个问题。+1我想提供相同的解决方案:但是如果integrate将其子类的functionx,y称为functionx,这可能吗?我对我的问题进行了编辑,以澄清这一点。@fophillips在这种情况下,您可以向积分器添加一个setIVP方法,以便它们可以相互引用。最后,我以相反的方式进行了修改,并确保所有积分器都是用IVP构建的。+1我想提供相同的解决方案:但如果integrate调用其子类的functionx,y,这可能吗?我对我的问题进行了编辑,以澄清这一点。@fophillips在这种情况下,您可以向积分器添加一个setIVP方法,以便它们可以相互引用。最后,我以另一种方式进行了编辑,并确保所有积分器都是使用IVP构建的。