gpt4 book ai didi

java - 在嵌套枚举实现接口(interface)中继承泛型类型

转载 作者:行者123 更新时间:2023-11-30 05:34:17 26 4
gpt4 key购买 nike

我尝试为我的状态机编写一个通用抽象类,它将利用枚举实现该抽象类中定义的一些接口(interface)。我有一个抽象类,其中包含一个实现通用接口(interface)的字段和一些用于状态切换逻辑的包装函数。我尝试扩展这个抽象类并创建实现此通用接口(interface)的嵌套枚举类型,但在某些地方,我必须明确定义我用于泛型的类型。下面的代码演示了这个问题

public abstract class FiniteStateMachine<C, I> { // <- generic types declared here
private State<C, I> currentState;
protected FiniteStateMachine(State<C, I> initial){ currentState = initial; }
// some other methods for FSM, that I don't want to include in State<>
// ...

public synchronized void process(C context, I input) {
State<C, I> nextState = currentState.process(context, input)
if(currentState != nextState){
currentState.onExit(nextState, context);
State<C, I> previousState = currentState;
currentState = nextState;
nextState.onEnter(previousState, context);
}
}

public interface State<C, I> { //<- this interface should use the same types as FiniteStateMachine
State<C, I> process(C context, I input);
default void onEnter(State<C, I> s, C context) {}
default void onExit(State<C, I> s, C context) {}
}
}
class FSM extends FiniteStateMachine<Data, String> { // <- here I define types used for FSM
public FSM() { super(FSMStage.START); }

enum FSMState implements State<Data, String> { // <- and here I have to repeat them
START{
@Override
public FSMState process(Data p, String s) {
// ...
return NEXT;
},
@Override
public void onExit(State s, Data d) { /* ... */ }
},
NEXT{
// ...
}

}
}

主要关注的是类型信息在扩展类的多个位置定义 - 一次在抽象类的类型信息中,一次在枚举实现的接口(interface)中。

FiniteStateMachine 是抽象的,而不是接口(interface),因为我需要一些标志和初始状态字段(除了 protected 构造函数 hack 之外,我无法创建“抽象字段”)。 FiniteStateMachine.State 是一个接口(interface),因为它用于无法扩展的枚举。我还想将 FiniteStateMachine 和 FiniteStateMachineState 保留在一个文件中,因为单独的字段会在项目中创建大量臃肿内容。还在扩展 FSM 内部 onExit方法具有 State 类型,而不是 FSMStage。

我尝试过类似FiniteStateMachine<C, I, State<C, I>>的东西但错误表明“状态在上下文中不可访问”。

有没有办法在扩展类中的一个地方声明类型而不是像现在这样的 FSM 和 FSMState?或者也许有一种方法只为 FSMState 声明类型并使 FSM 重用这些类型?或者这个设计可能完全有缺陷?

最佳答案

要点是内部接口(interface)(顺便说一句还有枚举)是隐式静态的,因此它们不能使用外部类的泛型参数,因为它们无法访问外部类的实例。

所以基本上这个接口(interface)位于抽象类内部只是为了代码方便,您也可以将其提取到单独的文件中。在这个设计中,我认为没有办法跳过多个泛型类型声明。

我认为仅仅为了避免重新声明而更改设计是不值得的 - 您可以将 State 设为一个抽象类并从声明中删除泛型类型,以便它从外部类获取泛型类型,但枚举的想法行不通。

关于java - 在嵌套枚举实现接口(interface)中继承泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56918132/

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