Могу ли я объявить ArrayList таким образом?

Iterable<Board> theNeighbors = new ArrayList<Board>();

Вот моя инициализация для ArrayList theNeighbors, которая использует interafce Iterable для объявления. Однако, поскольку я использую метод add() для только что построенной переменной, предупреждения компилятора

Board.java:78: ошибка: не удается найти символ theNeighbors.add(nb);                       ^
символ: метод добавить (Совет)
location: variable theNeighbors типа Iterable

Как это происходит? В другом случае, когда я использую

List<Board> theNeighbors = new ArrayList<Board>();

Метод add() работает хорошо. Верно ли, что интерфейс, который вы выбираете для объявления, должен всегда иметь метод, который вы хотите назвать позже?

Ответ 1

Если вы прочитали документацию для интерфейса Iterable, вы увидите, как вы сказали, что метод add() не существует.

Правда ли, что интерфейс, который вы выбираете для объявления, должен всегда иметь метод, который вы хотите назвать позже?

Выбранный интерфейс должен иметь все поведение объекта, который вы планируете создавать и использовать.

Когда вы объявляете свой ArrayList следующим образом:

Iterable<Board> theNeighbors = new ArrayList<Board>();

JVM рассматривает theNeighbors как Iterable и поэтому не может найти метод add(). С другой стороны, если вы определяете свой ArrayList следующим образом:

List<Board> theNeighbors = new ArrayList<Board>();

тогда JVM может найти метод add(), поскольку все типы List имеют этот метод (и поведение).