gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:43:30 25 4
gpt4 key购买 nike

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

到目前为止,这种类的层次结构以及它们的定义方式运行得非常完美,因此我认为没有必要在这方面寻求改进。

现在我必须实现另一个类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);
}
}
}

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

但是做 Generation(Mathfunc tp) 对我来说似乎有点奇怪,因为抽象类不可实例化。

附注This似乎是一个可能的解决方案,但我非常不确定它或它实际上是如何工作的。

最佳答案

如果您想重用 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):

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());

关于java - 如何在模板类中实例化 T 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20515026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com