我正在为AI课做一些事情,但是我似乎在项目结构方面遇到了问题。我知道在Python中这样做比较容易,但是我已经这样做了,而在Java中这样做是因为我有时间杀死它。
我的班级设置如下:
ProblemInterface
,ActionInterface
,StateInterface
。ProblemInterface
中定义的方法,因此保留ArrayList
个中的ProblemInterface
。ProblemQ1
类(尝试实现)ProblemInterface
。其他类ActionQ1
和StateQ1
实现它们各自的接口。
class ProblemQ1 implements ProblemInterface
class ActionQ1 implements ActionInterface
class StateQ1 implements StateInterface
ProblemInterface
定义了一个名为actions()
的方法,该方法接受一个StateInterface
参数并返回一个ArrayList<ActionInterface>
。因此,类似:
ArrayList<ActionInterface> actions(StateInterface state);
ProblemQ1
类正试图通过让actions()
参数返回StateQ1
的{{1}}来定义ArrayList
。
ActionQ1
public ArrayList<ActionQ1> actions(StateQ1 state)
类不能是抽象的,因为我必须针对要解决的每个问题实例化它。ProblemQ1
,ProblemQN
和StateQN
类,以实现它们各自的接口。但是,我收到一个编译器错误,告诉我我的ActionQN
类必须是抽象的或实现ProblemQ1
方法。从我所看到的,它遵循接口的规则,我看不出为什么不将在ProblemInterface
中定义actions()
视为定义接口。
答案 0 :(得分:1)
根据我所看到的,它遵循接口的规则,而我 无法看到为什么不将在ProblemQ1中定义action()视为 定义接口。
否,您没有更改ProblemQ1
中方法的参数类型:
public ArrayList<ActionQ1> actions(StateQ1 state)
尽管接口定义的方法类似于:
ArrayList<ActionInterface> actions(StateInterface state);
这意味着您将重载而不覆盖该方法。
用@Override
注释该方法,您会发现编译器不会将其视为替代。
另请注意,重写的返回类型也不兼容。
ArrayList<ActionQ1>
不是ArrayList<ActionInterface>
的子类。
但是ArrayList<ActionQ1>
是ArrayList<? extends ActionInterface>
的子类。
要解决您的问题,您可以在界面中引入泛型:
public interface ProblemInterface<T extends StateInterface, U extends ActionInterface>{
ArrayList<U> actions(T state);
}
实现可能是这样
public class ProblemQ1 implements ProblemInterface<StateQ1, ActionQ1>{
public ArrayList<ActionQ1> actions(StateQ1 state){
// ...
}
}