如何在模板类中实例化T类型

时间:2013-12-11 09:15:24

标签: java oop

我有一个抽象类abstract class MathFunc,用于在特定类final class Rastrigin extends MathFuncfinal class Griewangk extends MathFuncfinal class Rosenbrock extends MatjFunc中实现Rastrigin,Griewangk和Rosenbrock的数学函数。

这个类的层次结构以及它们到目前为止的定义如何完美无缺,所以我认为没有必要在这方面寻找改进。

现在我必须实现另一个类Generation,其中会有一些ArrayLists,但问题是我需要为上述每个数学函数设置一个Generation实现。 所以我需要这样的东西:

ArrayList<Rastrigin> rast = new ArrayList<>();
ArrayList<Griewangk> grie = new ArrayList<>();
ArrayList<Rosenbrock> rose = new ArrayList<>();

在这些列表中,我需要实例化一些Rastrigin / Griewangk / Rosenbrock对象。

我从过去的C ++项目中了解到,我可以使用模板来指定通用数据类型,我认为这是我的解决方案。到目前为止,我的实现看起来像这样:

public class Generation <MathFunc> {
    private final ArrayList<MathFunc> pop = new ArrayList<>();
    private final ArrayList<MathFunc> nextpop = new ArrayList<>();
    private final ArrayList<MathFunc> Crossover = new ArrayList<>();

    Generation(MathFunc tp)
    {
        for(int i = 0; i < PopSize; i++)
        {
            pop.add(tp);
        }
    }
}

但问题是:我可以使用抽象类来实例化依赖它的对象吗?还有另一种方法吗?我对模板的使用感到很困惑。

但是由于抽象类不可实现,因此对我来说似乎有点奇怪。

P.S。 This似乎是一种可能的解决方案,但我不确定它或它是如何运作的。

1 个答案:

答案 0 :(得分:1)

如果您想重用MathFunc的同一个实例,我不会在您的代码中看到任何重大缺陷(除了Generation的通用定义应为Generation<T extends MathFunc)。

所以首先要改变你的课程:

public class Generation <T extends MathFunc> {
  private final ArrayList<T> pop = new ArrayList<>();
  private final ArrayList<T> nextpop = new ArrayList<>();
  private final ArrayList<T> Crossover = new ArrayList<>();

  Generation(T tp)  {
    for(int i = 0; i < PopSize; i++) {
        pop.add(tp);
    }
  }
}

然后像这样实例化Generation

Generation<Rastrigin> rastriginGen = new Generation<>(new Rastrigin());
Generation<Griewangk> griewangkGen = new Generation<>(new Griewangk());
Generation<Rosenbrock> rosenbrockGen = new Generation<>(new Rosenbrock());

如果要在MathFunc内使用Generation的多个实例,则可能需要使用工厂模式。

工厂界面:

interface MathFuncFuncFactory<T extends MathFunc> {
  T createFunc();
}

然后添加RastriginFactory implements MathFuncFuncFactory<Rastrigin>等实现

内生:

Generation(MathFuncFactory<T> factory) {
  for(int i = 0; i < PopSize; i++) {
        pop.add(factory.createFunc());
    }
}

构造函数调用:

Generation<Rastrigin> rastriginGen = new Generation<>(new RastriginFactory());