Из того, что я вижу, следует правила интерфейса, и я
не могу понять, почему он не будет обрабатывать определяющие действия () в ProblemQ1 как
определение интерфейса.
Нет, вы изменили тип параметра метода в 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){
// ...
}
}