我最近一直在从事一个使用通用最佳搜索算法的 Java 项目。为了使算法本身通用,我在算法中使用的所有类上使用了一堆泛型。
这是所有的类/接口声明:
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));
我最终得到一个绑定不匹配错误,指出这GameState
不是<E extends AbstractState<E>>
. 现在,我相信我明白为什么会这样了。我的想法是因为GameState
extends AbstractState<String>
,而不是AbstractState<E>
。
不幸的是,我不希望我的GameState
类有一个通用类型。它旨在实现实际做某事,因此从泛型切换到字符串。例如,我可能想GameState
在一个完全不同的项目中创建一个类,该项目使用整数来实现它。
鉴于我在类中使用和执行的方法、变量和操作GameState
,它不能是通用的。
毕竟我的问题是:有没有办法将我的GameState
类实现为非泛型类,以满足我的类提出的边界要求StateSearch
?
我不介意是否必须更改某些类声明。关键是我需要 Algorithm 是Generic,并且 Implementation 是Non-Generic。GameState
班级需要成为我在两者之间过渡的点。
编辑:
我需要
GameState
类作为某个游戏的实现。和接口旨在让我无需实际实现即可构建状态搜索算法AbstractState
。State
以这种方式进行设置允许我在多个游戏中应用此设置。
该类StateSearch
基本上只是将状态从我的 中拉出StateQueue
,这只是一个AbstractState
按优先级系统排序的类向量(因此是 Comparable 实现)。扩展状态树的方式是使用类中的getNextState()
函数AbstractState
。这很好,但该getNextState()
函数基本上是从我的getSuccessors()
函数中获取最佳状态,该状态只能在GameState
Class 中定义。在其他地方,它只是抽象的。
我无法getSuccessors()
以通用方式定义函数,因为它纯粹基于实现。此函数旨在从当前状态返回所有可能的状态。例如,如果游戏是井字游戏,该getSuccessors()
函数将返回一个游戏状态列表,其中每个状态代表一个可能的移动。
该类GameState
还包含 a getEstimatedCost()
,getRunningCost()
它基本上分别充当h(x)和g(x)函数。这也只能在GameState
类中定义,因为两者都取决于实现。