java - 从抽象泛型到非抽象非泛型

标签 java algorithm generics abstract-class bounded-wildcard

我最近一直在用 Java 开发一个项目,该项目使用通用最佳搜索算法。为了使算法本身具有泛型,我在算法中使用的所有类上使用了一堆泛型。

这是所有的类/接口(interface)声明:

public class StateSearch<E extends AbstractState<E>>
public class AbstractState<E> implements State<E>
public class StateNode<E extends AbstractState<E>> implements Comparable<StateNode<E>>
public class StateQueue<E extends AbstractState<E>>
public interface State<E> extends ComparableState<E>>

现在理论上,所有这些都可以正常工作。但是,当我应用该算法时,我计划让“E”成为某种游戏状态(比如西洋跳棋、纸牌游戏、探路者等)。因此,我创建了以下类:

public class GameState extends AbstractState<String>

我对这个特定设置的意图是让 GameState 成为表示特定游戏状态的字符串的容器。但是,这会导致尝试使用以下代码创建 StateSearch 时出现问题:

new StateSearch<GameState>(new GameState(initialState), new GameState(goalState));

我最终得到一个绑定(bind)不匹配错误,说明 GameState不是 <E extends AbstractState<E>> 的有效替代品.现在,我相信我明白为什么会这样了。我的想法是因为GameState延伸AbstractState<String> ,而不是 AbstractState<E> .

不幸的是,我不想要我的 GameState具有通用类型的类。它旨在实现实际做某事,从而从泛型切换到字符串。例如,我可能想创建一个 GameState在使用整数实现的完全不同的项目中上课。

考虑到我在 GameState 中使用和执行的方法、变量和操作Class,不能是Generic。

我的问题是: 有没有办法实现我的 GameState以满足我的StateSearch提出的边界要求的方式分类为非通用类上课?

我不介意必须更改一些类声明。关键是我需要算法是通用的,而实现是非通用的GameState类需要成为我在两者之间过渡的点。


编辑:
我需要 GameState作为某个游戏的实现的类。 AbstractStateState接口(interface)旨在让我无需实际实现即可构建状态搜索算法。以这种方式进行设置可以让我在多个游戏中应用此设置。

StateSearch类(class)基本上只是把国家从我的StateQueue中拉出来, 这只是 AbstractState 的 vector 按优先级系统排序的类 (因此 Comparable 实现)。 State Tree展开的方式是使用getNextState()来自 AbstractState 的功能类(class)。这很好,但是 getNextState()函数基本上从我的 getSuccessors() 中获取了最佳状态函数,只能GameState 中定义类(class)。在其他任何地方它都只是抽象的。

我无法定义 getSuccessors()以通用方式运行,因为它完全基于实现。此函数旨在从当前状态返回所有可能的状态。例如,如果游戏是 Tic-Tac-Toe,则 getSuccessors()函数将返回一个游戏状态列表,其中每个状态代表一个可能的移动。

GameState类还包含一个 getEstimatedCost()getRunningCost()基本上分别充当h(x)g(x) 函数。这也只能GameState 中定义类,因为两者都取决于实现。

最佳答案

您定义事物的方式实际上是 Curiously recurring template pattern 的实现。

当你有:

public class StateSearch<E extends AbstractState<E>>

这意味着要使用 GameState 作为其通用类型,需要将其定义为:

public class GameState extends AbstractState<GameState>

至于您真正需要的是什么,不清楚您为什么需要泛型。为什么 GameState 界面不够用?

关于java - 从抽象泛型到非抽象非泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21507053/

相关文章:

java - hibernate一对多自动添加子对象异常

javascript - 每个单独 ID 的 jQuery min(最小值)

c++ - 为什么std::unique调用std::sort?

algorithm - 是否可以计算O(1)中Number中的Set位数?

ios - 通用 IBDesginables UIView 扩展

java - 尝试复制和重建项目时出现 Android Studio 错误

java - 接收多部分表单数据 - Jersey 1.19.1 REST

c++ - 如何为表达式解析器的派生类对象设置和取消引用通用指针?

java - 解决数独的多线程算法?

java - Java 中嵌套集合/结构的类型安全展平