This code is ok (Design to interface (List): -
List<Column> neighborColumns = new ArrayList<Column>();
List<Column> neighborColumns = new LinkedList<Column>(); // OK To change..
In the above code, you are basically designing to an interface rather than implementation..List is an interface and ArrayList is a concrete class implementing it.
An advantage is that, you can switch between various implementation, without changing the design..
Below code is a problem (Design to implementation (ArrayList):-
ArrayList<Column> neighborColumns = new ArrayList<Column>();
//OOPs.. Cry (Incompatible Types)
ArrayList<Column> neighborColumns = new LinkedList<Column>();
Here since you are designing to an implementation.. So you can not change the implementation on the RHS.. The compiler will cry as above..
So, in general also, you should always design to an interface, thus not exposing the implementation, and also gaining flexibility of changing the implementation anytime..