Java 创建与子类相同类型的对象

Java 创建与子类相同类型的对象,java,inheritance,types,subclass,superclass,Java,Inheritance,Types,Subclass,Superclass,我正在设计一个遗传算法库,目前正在构建基因组类。这个类包括几个用于创建、突变、杂交和评估基因组的方法,并且将是这个库的核心。这个抽象类有两个子类StaticGenome和VariableGenome。这些类为固定或可变长度的基因组提供了额外的功能 最终,任何两个基因组的杂交都应该独立于基因组类型。也就是说,singlePointCrossoverGenome parent2方法接收两个基因组,并返回一个新的基因组对象,它是两个父基因组的特殊组合。然而,因为Genome是一个抽象类,所以我不能将一

我正在设计一个遗传算法库,目前正在构建基因组类。这个类包括几个用于创建、突变、杂交和评估基因组的方法,并且将是这个库的核心。这个抽象类有两个子类StaticGenome和VariableGenome。这些类为固定或可变长度的基因组提供了额外的功能

最终,任何两个基因组的杂交都应该独立于基因组类型。也就是说,singlePointCrossoverGenome parent2方法接收两个基因组,并返回一个新的基因组对象,它是两个父基因组的特殊组合。然而,因为Genome是一个抽象类,所以我不能将一个新的Genome对象实例化为它的后代

如何从超类返回与子类相同类型的新对象

如蒙协助,将不胜感激

基因组类别:

两个子类:

public class StaticGenome<ElementType> extends Genome<ElementType> {

}

public class VariableGenome<ElementType> extends Genome<ElementType> {

}
以及我用于测试的主要方法:

public static void main(String [] args){
    Genome<IntegerElement> genomeA = new StaticGenome<IntegerElement>("Genome A", 50);
    Genome<IntegerElement> genomeB = new StaticGenome<IntegerElement>("Genome B", 50);

    Genome<IntegerElement> offspring = genomeB.uniformCrossover(genomeA.elementCrossover(genomeA.multiPointCrossover(genomeB, 3)));
    offspring.setName("Offspring");
    System.out.println(offspring);
}

我认为你需要在Genome和Static/VariableGenome类之间再引入一个类。我不是微生物学专家,所以不能推荐一个好的逻辑名称给它。但是如果您有一个新的子类,比如说您的基因组的newGenomeClass,并充当静态/VriablGenome类的父类,那么您可以使用如下方法:

public newGenomeClass singlePointCrossover(newGenomeClass parent1,newGenomeClass parent2).

希望有帮助

我认为您需要在基因组和静态/可变基因组类之间再引入一个类。我不是微生物学专家,所以不能推荐一个好的逻辑名称给它。但是如果您有一个新的子类,比如说您的基因组的newGenomeClass,并充当静态/VriablGenome类的父类,那么您可以使用如下方法:

public newGenomeClass singlePointCrossover(newGenomeClass parent1,newGenomeClass parent2).

希望有帮助

您可以从重写的方法返回一个子类,它称为co-variant返回类型

abstract class Genome {
    abstract Genome singlePointCrossover(Genome parent2); 
}

class StaticGenome extends Genome {
    @Override
    StaticGenome singlePointCrossover(Genome parent2) {
        ...
    }
}

class VariableGenome extends Genome {
    @Override
    VariableGenome singlePointCrossover(Genome parent2) {
        ...
    }
}

您可以从重写的方法返回一个子类,它称为co-variant返回类型

abstract class Genome {
    abstract Genome singlePointCrossover(Genome parent2); 
}

class StaticGenome extends Genome {
    @Override
    StaticGenome singlePointCrossover(Genome parent2) {
        ...
    }
}

class VariableGenome extends Genome {
    @Override
    VariableGenome singlePointCrossover(Genome parent2) {
        ...
    }
}

您可以将以下方法引入抽象类并在子类中实现它

protected abstract Genome<ElementType> newInstance(String name, List<AbstractGenomeElement<ElementType>> elements);

当子类实现这一点时,它们可以返回正确的实例。i、 e:他们自己的一个新例子。在交叉方法中,您可以调用此方法而不是执行“新基因组”

您可以将以下方法引入抽象类并在子类中实现它

protected abstract Genome<ElementType> newInstance(String name, List<AbstractGenomeElement<ElementType>> elements);

当子类实现这一点时,它们可以返回正确的实例。i、 e:他们自己的一个新例子。在您的交叉方法中,您可以调用此方法而不是执行“新基因组”

如果我是正确的,问题是:给定某个基因组对象,它将是抽象类Genome的某个子类,我们如何实例化该子类的新实例

嗯,我不知道这是否是最好的方法,但这是我想到的:

public Genome<ElementType> 
multiPointCrossover(Genome<ElementType> genome2, int crosses){
    // Snip...
    Genome g;
    try {
        g = genome2.getClass()
                .getConstructor(String.class, List.class)
                .newInstance();
    } catch (Exception e) {
        // Can throw quite a few exceptions...
    }
    return g;
}


注意:我认为devblanked的解决方案更干净,更易于使用。这正是我在他们发布时想到的。

如果我是正确的,问题是:给定某个基因组对象,它将是抽象类基因组的某个子类,我们如何实例化该子类的新实例

嗯,我不知道这是否是最好的方法,但这是我想到的:

public Genome<ElementType> 
multiPointCrossover(Genome<ElementType> genome2, int crosses){
    // Snip...
    Genome g;
    try {
        g = genome2.getClass()
                .getConstructor(String.class, List.class)
                .newInstance();
    } catch (Exception e) {
        // Can throw quite a few exceptions...
    }
    return g;
}


注意:我认为devblanked的解决方案更干净,更易于使用。这正是我在他们发帖时想到的。

读了上面的帖子,我发现基因组只能有两种类型:静态基因组和可变基因组。现在,当你想要返回一个基因组时,它将是这两种类型中的任何一种。对吗?我想是的。目前,我没有任何其他的基因组实现方案,但我可以想象,有人可能想要创建一个新的子类2DGenemy或其他具有附加功能的东西。阅读上述文章,我可以看到基因组只能有两种类型:StaticGenome和VariableGenome。现在,当你想要返回一个基因组时,它将是这两种类型中的任何一种。对吗?我想是的。目前,我还没有考虑任何其他的基因组实现,但我可以想象有人可能想要创建一个新的子类2DGenemy或其他具有附加功能的东西。问题是,不管可变长度或静态长度,交叉都是一样的。所以我想把代码放在Genome类中,这样我就不会复制代码不像接口,抽象类可以包含非静态和最终的字段,它们可以包含实现的方法。让Genome成为一个抽象类,但不要让singlePointCrossover抽象。是的,我刚刚意识到我完全错过了你的问题——实际的问题,对不起:问题是,不管可变长度还是静态长度,交叉都是一样的。所以我想把代码放在Genome类中,这样我就不会复制代码不像接口,抽象类可以包含非静态和最终的字段,它们可以包含实现的方法。使基因组成为一个抽象类,但不要
不要把单点交叉抽象化。是的,我刚刚意识到我完全错过了你的问题——实际上的问题,对不起: