试图为遗传算法编写一些通用代码,我有一个抽象类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();
}

09-28 13:03