List<tipoDato> name = new ArrayList<tipoDato>?

Hola a todos tengo una duda con respecto a la declaracion de una lista o bien un arraylist, eh visto que se pueden declarar listas de
esta manera:  
y la verdad entiendo un poco sobre el por que de esta declaracion y sobre sus ventajas a si declarar un ArrayList de manera normal:
 .

A menos que este mal se que un ArrayList no contiene indice como un areglo normal y que la lista si tiene ya que se puede acceder a sus elementos de una manera normal (for nomal) pero eh buscado sobre el porque declarar una lista de la primera forma y la informacion que eh encontrado no me deja del todo satisfecho.

Por eso mismo acudo a ustedes y me puedan ayudar a aclarar un poco esta duda.

Gracias!!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Siempre es mejor usar la

Siempre es mejor usar la interfaz como tipo de dato que el tipo concreto.

Esto hace más flexible tu programa ya que en caso de ser necesario se podría cambiar la implementación y tu programa seguirá funcionando.

Polimorfismo

Lo que dice OscarRyz es correcto, yo agregaria un comentario más que creo podría ayudarte a entender, no solo este tema, busca información sobre polimorfismo.

Imagen de arterzatij

Hoy me acabo de topar con

Hoy me acabo de topar con esto y no siempre es asi OscarRyz...

Tengo un repositorio que retorna   pero al asignarlo a un   no me lanza error. Si cambio a   me lanza un error de que no puedo castear de   a  ....

Termine haciendo esto para que funcionara

 

Java 1.8 u45
Spring boot 1.2.3.RELEASE
JPA Data Rest

Pero sin duda es mejor utilizar las interfaces.

Imagen de ezamudio

Jerarquía

No puedes asignar un Iterable a un List porque List es Iterable pero Iterable no es List (puede ser otra cosa). Set es Iterable pero Iterable no es un Set.

Esto que mencionas es un caso completamente distinto. Lo que menciona Oscar sí es recomendable siempre: usar en tus APIs las interfaces lo más general posible, por ejemplo si tienes un método que devuelve una lista, devolver List, no ArrayList ni LinkedList ni nada de eso, porque esas son implementaciones. Internamente vas a usar una implementación para crear la lista pero eso no le debe importar a quien invoca el método. Del mismo modo, si esperas recibir una lista en un método, el tipo del parámetro debería ser List, para no forzar a que te pasen un cierto tipo de lista (ArrayList, LinkedList, etc). Lo mismo va para Map, Set, etc. Esto es algo general, no es nada más con colecciones.

Que una dos clases

Que una dos clases implementen la misma interfaz ( Iterable ) no implica que ambas implementen otra interfaz ( Set )

Si lo ponemos con ejemplos más burdos sería así:

 

Cuando intentas asignar un arraylist a un Set estas haciendo lo mismo que asignar un salmon a un mamifero, solo porque sea animal no significa que es un set.

Al programar a "la interfaz" habilitamos que nuestro código pueda recibir diferentes tipos:

 

Al indicar que el tipo de dato sea "Comestible" dejamos que el código reciba por igual animales mamiferos que oviparos y más aún dejamos que reciba comestibles que no son animales. Si no se usara así se comería solo salmon