Duda con Polimorfismo

Hola, estoy haciendo mi curso para certificacion y me surgio una duda espero alguien me pueda ayudar.

En cuanto las colecciones, cual es el motivo de hacer la referencia generalizada

List lista = ArrayList();

existe alguna diferencia al hacer esto?

ArrayList<> lista = ArrayList();

No entiendo muy bien el echo de generalizar a la clase base, se utilizarlo pero quisiera saber mas como la explicacion tecnica de porque se generaliza?

Padre obj = new HIjo();

Muchas gracias. espero puedan ayudarme con mi duda

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.
Imagen de Sr. Negativo

Re: Duda con Polimorfismo

No entiendo muy bien el echo de generalizar a la clase base, se utilizarlo pero quisiera saber mas como la explicacion tecnica de porque se generaliza?

Padre obj = new HIjo();

Tal vez un ejemplo te sirva(eso es sobre herencia):
 

Gracias

sip muchas gracias... me gustaria saber mas al respecto en cuanto ala teoria, de generalizar en el polimorfismo....

Imagen de julgo

la diferencia esta en que con

la diferencia esta en que con :
  pierdes los metodos específicos de arraylist ,pero tu código es mas flexible ya que tiene la misma funcionalidad con otras implementaciones que quieras cambiar o aumentar digamos
  y con eso por ejemplo puedes reusar código asi un método que reciba tanto el arraylist como el linkedlist e imprima los elementos
 

Se recomienda programar a la

Se recomienda programar a la interfaz ( al conjunto de métodos que quieres llamar ) y no a la implementación para que el código no quede tan acoplado.

Dicho de otra forma, si tuvieras un metodo que recibiera:

 

Estarias amarrando a que SOLO le puedas pasar instancias de ArrayList.

En cambio si se declara:
 
Podrias llamarlo asi:
 

O con cualquiera de las clases que implementan la interfaz list ( )

Imagen de echan

En realidad usar una

En realidad usar una implementacion concreta como ArrayList o LinkedList en lugar de la interfaz List, es un tema de acoplamiento como comenta @OscarRyz y poco tiene que ver con el polimorfismo. El polimorfismo es otra cosa.

El polimorfismo, en el caso de tu ejemplo es el polimorfismo paramétrico (genericos en el mundo Java) y se manifiesta cuando creas componentes o algoritmos que operan sobre objetos sin especificar.

Por ejemplo:
El ArrayList es un estructura polimorfica, si ves el método add(E e), "E" representa el tipo de un objeto que no sabemos que es hasta que se cree una instancia de ArrayList con el parámetro de clase, es decir, el código de add está escrito de forma generica, entonces cuado creas:

 

"Padre" es el parametro de clase de ArrayList y es en ese momento "E" en el método add se veria imaginariamente como add(Padre e) para la instancia lista que se creó.

Las ventajas de los genericos es la garantia de la verificación estática, usar genéricos te garantiza que el compilador te diga cuando no estas usando un método con el tipo de dato adecuado, o usar estructuras de control como el for sin tener que inspeccionar en runtime el tipo de objeto sobre la lista, o tambien reusar componentes o algoritmos genericos.

En fin tiene varias ventajas .. pero tambien habria que decir que incidentalmente trae cosas extrañas y un poco bizarras. Cuando mezclas polimorfismo parametrico + herencia(subtyping) incidentalmente tienes covarianza y contravarianza.

Imagen de bferro

Cuidado con mezclar genéricos con raw types

En el código que escribes con anterioridad (lo escribo otra vez):
 

estás mezclando incorrectamente los tipos genéricos con los tipos raw, que el lenguaje ha tenido que mantener para que el código anterior a Java 5 pueda seguir corriendo. Cuando compilas un programa que incluye esa línea obtendrás un warning del compilador:
 
Desafortunadamente muchos no atienden a esos warnings. El mezclar genéricos con raw types puede provocar errores y sorpresas. Pongo un código de ejemplo:
 

Los <> deciden muchas cosas. No hay que olvidarse de ellos cuando se crea el objeto que vas a usar como implementación.
 

Imagen de echan

cierto, estaba ilustrando el

cierto, estaba ilustrando el parámetro de clase y no le puse atencion a la linea completa. Pero como dices lo que ilustras es origen de muchos dolores de cabeza .. pero ya poniendonos mas especiales esa linea esta lejos de compilar porque además del operador diamond falta el keyword new ... :)

 

Imagen de bferro

No es ponernos más especiales

Dejé tu línea tal y como estaba que por supuesto es errónea y no era lo que quería comentar. La intención de mi comentario no es para eso de ponernos más especiales. Cada cual acepta las opiniones de otros como mejor le plazca.