2015-07-22 12 views
11
Iterable<Board> theNeighbors = new ArrayList<Board>(); 

Oto moja inicjalizacja dla ArrayList theNeighbour, który używa interafce Iterable do deklaracji. Jednakże, jak użyć metody add() do zmiennej po prostu zbudowany, alarmy kompilatoraCzy mogę zadeklarować ArrayList w ten sposób?

Board.java:78: error: cannot find symbol theNeighbors.add(nb); ^
symbol: method add(Board)
location: variable theNeighbors of type Iterable

Co sprawia, że ​​tak się stało? W innym przypadku używam metody

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

Metoda działa dobrze. Czy to prawda, że ​​interfejs wybrany do deklaracji powinien zawsze mieć metodę, którą chcesz wywołać później?

+1

Tak, zmienna o nazwieNeighbors jest zmienną Iterable, która nie ma metody add(). Jednakże, jeśli chcesz użyć zarówno deklaracji iteracyjnej, jak i metody add(), możesz użyć ((List) theNeighbors) .add (nb); – furkan3ayraktar

+0

Czy java używa tego mechanizmu, aby uniemożliwić zainicjowanie tej zmiennej inną implementacją, która nie powoduje – tonyabracadabra

Odpowiedz

32

Po przeczytaniu documentation interfejsu Iterable zobaczysz, jak wspomniałeś, że metoda add() nie istnieje.

Is it true that the interface you choose for the declaration should always have the method you want to call later?

Wybrany interfejs powinien mieć wszystkie zachowania obiektu, który planujesz utworzyć i użyć.

Kiedy zadeklarować ArrayList tak:

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

JVM traktuje theNeighbors jako Iterable i dlatego nie może znaleźć sposobu add(). Z drugiej strony, jeśli zdefiniować ArrayList ten sposób:

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

następnie JVM może znaleźć metodę add() ponieważ wszystkie typy List mają tę metodę (i zachowanie).