试图为遗传算法编写一些通用代码,我有一个抽象类Genotype,如下所示:
public abstract class Genotype {
private ArrayList<Gene> genotype = new ArrayList<Gene>();
//...
public Genotype(ArrayList<Gene> genotype) {
setGenotype(genotype);
setGenotypeLength(genotype.size());
}
public abstract Phenotype<Gene> getPhenotype();
public abstract void mutate();
//...
}
打算扩展该类,并且该子类显然提供getPhenotype()和mutate()的实现。但是,我还有第二个类,它使用两个Genotype对象作为参数,并返回一个包含Genotype对象的ArrayList。由于此时我还不知道扩展Genotype对象的类型,因此需要使用以下通用参数:
public class Reproducer {
//...
private <G extends Genotype> ArrayList<Genotype> crossover(G parent1, G parent2) {
ArrayList<Genotype> children = new ArrayList<Genotype>();
ArrayList<Gene> genotypeOne = ArrayListCloner.cloneArrayList(parent1.getGenotype());
ArrayList<Gene> genotypeTwo = ArrayListCloner.cloneArrayList(parent2.getGenotype());
//one point crossover
int p = gen.nextInt(genotypeOne.size());
for (int i = 0; i < p; i++) {
genotypeOne.set(i, genotypeOne.get(i));
genotypeTwo.set(i, genotypeTwo.get(i));
}
for (int i = p; i < 10; i++) {
genotypeOne.set(i, genotypeTwo.get(i));
genotypeTwo.set(i, genotypeOne.get(i));
}
children.add(new G(genotypeOne)); //THROWS ERROR: Cannot instantiate the type G
children.add(new G(genotypeTwo)); //THROWS ERROR: Cannot instantiate the type G
return children;
}
}
但是,由于我需要在ArrayList中返回两个G类型的对象,所以我显然有一个问题,我无法实例化新的Genotype对象,因为它们是1.泛型类型,大概是2.抽象。
这可能是解决所有问题的一种坏方法,但是如果有人有很好的解决方案。谢谢。
最佳答案
我建议在您的Genotype
类中使用工厂方法
public abstract class Genotype {
public abstract GenoType newInstance();
}