java - 扩展泛型

标签 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 function(x, y)
    }
}

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

两者都以不同方式实现 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) {
        ...
    }
}

它们都以完全相同的方式实现 function(),但将使用其父级的 integrate()。因为 EulerCentral抽象的,所以它们都扩展 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>(...);

但我不能,因为我相信这里的 T 是类型而不是类。我可以做类似的事情吗?

最佳答案

您可以使用组合而不是继承。像这样的东西:

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

关于java - 扩展泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13213994/

相关文章:

java - 如何在java中限制同步块(synchronized block)的特定线程数

第二次 java.lang.InstantiationException

swift - 使用泛型和协议(protocol)作为类型参数的区别,在函数中实现它们的优缺点是什么

java - 是否可以绑定(bind)嵌套泛型?

java - 上下文菜单显示正确的数据,但 ListView 不显示

java - Dao 服务作为单例?

Maven:多个父 POM?

java - 如何让子类用扩展类型重写父类抽象方法?

java - 基于 Class<> 参数返回通用实现时未检查的强制转换警告

ios - 指定初始化程序?