实现一个接口,该接口的方法返回一个接口,但出现未实现的错误

时间:2018-11-04 17:00:46

标签: java interface abstract

我正在为AI课做一些事情,但是我似乎在项目结构方面遇到了问题。我知道在Python中这样做比较容易,但是我已经这样做了,而在Java中这样做是因为我有时间杀死它。

我的班级设置如下:

  1. 我有3个界面:ProblemInterfaceActionInterfaceStateInterface
  2. 我有一个Search类,它调用ProblemInterface中定义的方法,因此保留ArrayList个中的ProblemInterface
  3. 我有一个ProblemQ1类(尝试实现)ProblemInterface。其他类ActionQ1StateQ1实现它们各自的接口。
    • class ProblemQ1 implements ProblemInterface
    • class ActionQ1 implements ActionInterface
    • class StateQ1 implements StateInterface
  4. ProblemInterface定义了一个名为actions()的方法,该方法接受一个StateInterface参数并返回一个ArrayList<ActionInterface>。因此,类似:
    • ArrayList<ActionInterface> actions(StateInterface state);
  5. 因此,我的ProblemQ1类正试图通过让actions()参数返回StateQ1的{​​{1}}来定义ArrayList
    • ActionQ1
  6. public ArrayList<ActionQ1> actions(StateQ1 state)类不能是抽象的,因为我必须针对要解决的每个问题实例化它。
  7. 稍后我必须制作其他ProblemQ1ProblemQNStateQN类,以实现它们各自的接口。

但是,我收到一个编译器错误,告诉我我的ActionQN类必须是抽象的或实现ProblemQ1方法。从我所看到的,它遵循接口的规则,我看不出为什么不将在ProblemInterface中定义actions()视为定义接口。

1 个答案:

答案 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){
      // ...
    }
}