扩展通用

bou*_*ful 1 java generics polymorphism inheritance

我有一个抽象的课

public abstract class Integrator {
    public abstract Point integrate();
    public abstract Point function(Double x, Point y);
}
Run Code Online (Sandbox Code Playgroud)

延长了

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

两者的实施方式integrate()不同.现在,我实例化的具体类是这样定义的

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) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

它们都以function()完全相同的方式实现,但将使用它们的父级integrate().因为EulerCentralabstract它没有意义对他们都扩展一个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>(...);
Run Code Online (Sandbox Code Playgroud)

但我不能因为,我相信,T这里的类型不是一类.有什么类似我能做的吗?

fgb*_*fgb 5

您可以使用合成而不是继承.就像是:

public class IVP {
    private Integrator integrator;

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

    public Point function(Double x, Point y) {
        // Calculate using integrator.integrate();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使euler成为一个非抽象类:

IVP eulerIVP = new IVP(new Euler());
Run Code Online (Sandbox Code Playgroud)