You can't instantiate type parameters like T
directly. Instead you want Generation
to accept a factory, so that you can create a new instance in each iteration of the loop:
interface MathFuncFactory<T extends MathFunc> {
T create();
}
class Generation<T extends MathFunc> {
Generation(MathFuncFactory<T> factory) {
for (...) {
list.add(factory.create());
}
}
}
Then you could create a Generation
for a particular function as follows:
new Generation(new MathFuncFactory<Rastrigin>() {
public Rastrigin create() {
return new Rastrigin();
}
});
It might be beneficial to have a class that will make these factories:
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());
}
}
so you can simply call
new Generation(MathFuncs.rastrigin())
or just
MathFuncs.rastriginGeneration()