好的,我希望我不要试图在这里实现不可能。
我有一个抽象类abstract class MathFunc
,用于在特定类final class Rastrigin extends MathFunc
,final class Griewangk extends MathFunc
和final class Rosenbrock extends MatjFunc
中实现Rastrigin,Griewangk和Rosenbrock的数学函数。
我需要一个包含ArrayList的Generation类,它必须包含几个Rastrigin / Griewangk / Rosenbrock类型的对象。这些对象应该彼此分开实例化,因为Rastrigin / Griewangk / Rosenbrock在它们的构造函数中生成应该保持随机的随机数。
从我之前的问题here我设法实现了一个完全初始化的版本,但是通过ArrayList重复了相同的Rastrigin(例如)对象。根据那里给出的答案,我理解我应该使用Factory模式分别实例化每个对象。从答案中我得到了这段代码:
interface MathFuncFactory <T extends MathFunc()>{
T createFunc();
}
但它不起作用。如何正确实施此设计并使其按照我希望的方式工作?还有可能在我的Generation类中实例化一个T类型的对象吗?我是java的新手,所以详细的解释非常感谢。
P.S。我做了第二个答案,因为它与最初的问题无关,即java中泛型类的使用。
答案 0 :(得分:1)
您的代码中有两个错误:
1)()
extends MathFunc
2)abstract
方法也应标有abstract
关键字
abstract class MathFuncFactory <T extends MathFunc> {
abstract T createFunc();
}
关于您已关联的答案,您不需要接口的abstract
关键字:
interface MathFuncFuncFactory<T extends MathFunc> {
T createFunc();
}
答案 1 :(得分:1)
您无法直接实例化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()