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
- Inicie sesión o regístrese para enviar comentarios
Re: Duda con Polimorfismo
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....
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 ( )
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.
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.
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 ... :)
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.