gpt4 book ai didi

java - 具有扩展抽象类类型的工厂模式通用接口(interface)

转载 作者:行者123 更新时间:2023-12-02 06:25:59 25 4
gpt4 key购买 nike

好吧,我希望我不要在这里尝试实现不可能的事情。

我有一个抽象类abstract class MathFunc,用于在其特定类中实现数学函数 Rastrigin、Griewangk 和 Rosenbrock final class Rastrigin extends MathFunc, final class Griewangk 扩展了 MathFuncfinal class Rosenbrock 扩展了 MatjFunc

我需要一个包含 ArrayList 的 Generation 类,该 ArrayList 必须包含 Rastrigin/Griewangk/Rosenbrock 类型的多个对象。这些对象应该彼此分开实例化,因为 Rastrigin/Griewangk/Rosenbrock 在其构造函数中生成应该保持随机的随机数。

来 self 之前的问题here我设法实现了一个版本,该版本一开始就完全初始化,但在 ArrayList 中重复使用相同的 Rastrigin(例如)对象。从那里给出的答案中,我明白我应该使用工厂模式来单独实例化每个对象。从答案中我得到了这段代码:

interface MathFuncFactory <T extends MathFunc()>{
T createFunc();
}

但是这不起作用。我怎样才能正确地实现这个设计并使其按照我希望的方式工作?另外,是否可以在我的 Generation 类中实例化 T 类型的对象?我是java新手,非常感谢详细的解释。

附:我做出第二个答案是因为它与最初的问题(即 java 中泛型类的使用)关系不大。

最佳答案

您无法直接实例化 T 等类型参数。相反,您希望 Generation 接受工厂,以便您可以在循环的每次迭代中创建一个新实例:

interface MathFuncFactory<T extends MathFunc> {
T create();
}

class Generation<T extends MathFunc> {

Generation(MathFuncFactory<T> factory) {
for (...) {
list.add(factory.create());
}
}
}

然后您可以为特定函数创建一个Generation,如下所示:

new Generation(new MathFuncFactory<Rastrigin>() {
public Rastrigin create() {
return new Rastrigin();
}
});

拥有一个能够创建这些工厂的类可能会有所帮助:

class MathFuncs {

private MathFuncs() {}

static MathFuncFactory<Rastrigin> rastrigin() {
return new MathFuncFactory<Rastrigin>() {
public Rastrigin create() {
return new Rastrigin();
}
}
}

static Generation<Rastrigin> rastriginGeneration() {
return new Generation<Rastrigin>(rastrigin());
}
}

这样你就可以简单地调用

new Generation(MathFuncs.rastrigin())

或者只是

MathFuncs.rastriginGeneration()

关于java - 具有扩展抽象类类型的工厂模式通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20527407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com