gpt4 book ai didi

java - 正确使用泛化

转载 作者:行者123 更新时间:2023-12-01 18:25:26 24 4
gpt4 key购买 nike

假设您有以下接口(interface)

public interface Action {
public State execute(State state);
}
public interface State {
public Collection<Action> getPossibleActions();
}

还有这个方法

public static Collection<State> getAllSuccessorStates(State state){
Collection<State> allSuccessors = new HashSet<>();
for (Action action: state.getPossibleActions()){
State successorState = action.execute(state);
allSuccessors.add(successorState);
allSuccessors.addAll(getAllSuccessorStates(successorState));
}
return allSuccessors;
}

具体状态可以是例如棋盘和 Action (棋盘上棋子的移动)。显然,Chess-Actions 需要知 Prop 体的 State 类:

public class ChessAction implements Action {
@Override
public ChessState execute(ChessState state) {...}
}

这当然不是允许的覆盖执行的方式。实现这一点的正确方法是什么,以便您可以拥有具体的操作,对具体的状态进行操作,您可以将其作为参数提供给 getAllSuccessorStates?

我考虑了泛型,也得到了指向泛型的答案,但这带来了新的问题。如果我像这样编写 Action 类:

public interface Action<E extends State> {
public E execute(E state);
}

我的 ChessState 类会遇到以下问题:

@Override
public Collection<Action<State>> getPossibleActions() {
Collection<Action<State>> actions = new ArrayList<>();
actions.add(new ChessAction());
return actions;
}

Actions.add 行导致以下错误:Collection> 类型中的方法 add(Action) 不适用于参数 (ChessAction)
现在我可以将 Actions 声明为

Collection<Action<ChessState>> actions = new ArrayList<>(); 

但这不是允许的返回类型。

最佳答案

您可以使用泛型(需要 java 1.5 或更高版本):

public interface Action<T extends State> {
public T execute(T state);
}

public class ChessAction implements Action<ChessState> {
@Override
public ChessState execute(ChessState state) {...}
}

希望有帮助。

关于java - 正确使用泛化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378305/

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