使用"扩展"在三角括号内和一个类型" T"在Java中

时间:2016-04-21 04:01:35

标签: java inheritance arraylist polymorphism

我尝试理解为初学Java学生的部分代码如下:

public class StandardGA<T extends Chromosome> extends GeneticAlgorithm<T> {

private static final long serialVersionUID = 5043503777821916152L;

private final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(StandardGA.class);

/**
 * Constructor
 *
 * @param factory a {@link org.evosuite.ga.ChromosomeFactory} object.
 */
public StandardGA(ChromosomeFactory<T> factory) {
    super(factory);
}

/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
protected void evolve() {

    List<T> newGeneration = new ArrayList<T>();

    // Elitism
    newGeneration.addAll(elitism());

    // new_generation.size() < population_size
    while (!isNextPopulationFull(newGeneration)) {

        T parent1 = selectionFunction.select(population);
        T parent2 = selectionFunction.select(population);

        T offspring1 = (T)parent1.clone();
        T offspring2 = (T)parent2.clone();

我不确定如何搜索我不理解的答案,因为当我在网上搜索答案时,我不确定该怎么称呼它。如果你看一下代码的这一部分

public class StandardGA<T extends Chromosome> extends GeneticAlgorithm<T> {

<T extends Chromosome>有三角括号,&#34; T&#34;在它面前。我不确定如何以这种方式使用扩展,我认为T是一种类型,但也不了解它是什么或在哪里寻找它。

将类扩展到#34;遗传算法&#34;的旁边是什么意思。简单地扩展Genetic Algorithms而不是&#34; Genetic Algorithms<T>&#34;之间的区别是什么。

由于我的理解有限,我认为这是&#34; T&#34;是一种类型,因为您可以看到粘贴代码中的较低值,例如:

T parent1 = selectionFunction.select(population);

将变量parent1设置为&#34; T&#34;?或者我错了,这段代码试图做其他事情?提前感谢您的任何答案。

1 个答案:

答案 0 :(得分:1)

这是一个约束。这意味着T必须是某种类型的Chromosome

当您创建或声明StandardGA时,您必须指定一个必须是Chromsome的类型。

示例:

StandardGA<XXY> myGA = new StandardGA<XXY>();

这里是有界类型的链接。 https://docs.oracle.com/javase/tutorial/java/generics/bounded.html

GeneticAlgorithm<T>表示GeneticAlgorithm本身是使用类型参数声明的。

 public class GeneticAlgorithm<T> {  ...

否则T将是语法错误。你应该阅读泛型,它会帮助你很多。