Autor Tema: Ejercicio! entrega CU00678B polimorfismo java  (Leído 3573 veces)

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Ejercicio! entrega CU00678B polimorfismo java
« en: 15 de Agosto 2014, 01:31 »
 Este ejercicio parece sencillo, pero me puso a chocar la cabeza de la pared en muchos instantes, espero que este código implemente a el ejercicio CU00678  ;D
public class TestPolimorfismo
Código: [Seleccionar]
import java.util.Set;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.TreeSet;
 import java.util.Iterator;
public class TestPolimorfismo
{   
    public static void main(String []args)
    {
      //Creacion de objetos tipo ArrayList, HashSet y TreeSet.
      ArrayList<Set> listObjsUniversoYNumeros = new ArrayList<Set>();
      HashSet<String> universo = new HashSet<String>();
      TreeSet<Integer> numeros = new TreeSet<Integer>();
      //agregando elementos  de tipo String a la colección universo de tipo HashSet
      universo.add("sol"); universo.add("luna"); universo.add("saturno");
      //agregando elementos  de tipo Integer a la colección números de tipo TreeSet
      numeros.add(2); numeros.add(8); numeros.add(5);
      //agregando elementos  de tipos (HashSet y TreeSet) polimorficos a la clase Set, a la coleccion listObjsUniversoYNumeros de tipo ArrayList<Set>
      listObjsUniversoYNumeros.add(universo);
      listObjsUniversoYNumeros.add(numeros);
      //recorriendo colecciones con Iterator
      Iterator<Set> iteratorAL = listObjsUniversoYNumeros.iterator();
      Set elemento0 = iteratorAL.next();
      Set elemento1 = iteratorAL.next();
      Iterator<String> iElemento0 = elemento0.iterator();
      Iterator<Integer> iElemento1 = elemento1.iterator();
      //recorriendo y mostrando por pantalla los elementos de las colecciones universo y numeros, a través de Iterator
      String separador = ", ";
      System.out.print("\nConjunto de los elementos contenidos en cada una de las sub-colecciones que contiene la colección listObjsUniversoYNumeros: ");
      while(iElemento0.hasNext())
      {
        System.out.print(iElemento0.next() + separador);
      }
      int i = 0;
      while(iElemento1.hasNext())
      {
        i++;
        if(i == elemento1.size())
        {
          separador = ".";
        }
        System.out.print(iElemento1.next() + separador);
      }
      System.out.println("\nTotal: " + (universo.size() + numeros.size()) + " elementos.");       
    }
}
Tanto codigo para imprimir 2 lineas de texto, Lolz ;D
Saludos!
« Última modificación: 31 de Agosto 2014, 10:52 por Alex Rodríguez »
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Ejercicio! entrega CU00678B
« Respuesta #1 en: 16 de Agosto 2014, 19:21 »
Hola, el código compila y está bien diseñado  :D pero aparece un warning  :(.

Para ser coherente con los tipos  ::) que declaras:

tienes  ArrayList<Set> listObjsUniversoYNumeros

Más adelante declaras:

HashSet<String> universo = new HashSet<String>();
TreeSet<Integer> numeros = new TreeSet<Integer>();

Y finalmente añades:

listObjsUniversoYNumeros.add(universo);
listObjsUniversoYNumeros.add(numeros);


Pero estás añadiendo un tipo (HashSet y TreeSet) que no se corresponde con el tipo del ArrayList, que es Set.

Solución:

Set<String> universo = new HashSet<String>();
Set<Integer> numeros = new TreeSet<Integer>();

Estás usando el tipo Set y haciendo uso del polimorfismo los instancias bien en HashSet o bien en TreeSet, ahora sí te coinciden los tipos con los del ArrayList.Esto es una práctica muy habitual en Java. De esta forma un método puede requerir un tipo Set y puedes invocarlo pasándole tanto universo como numeros porque ambos son Set. En cambio si el método requiriera un HashSet sólo podrías pasarle universo pero no numeros. Ahí radica una ventaja del polimorfismo.


Ultimo paso, con lo que eliminamos el warning:

Iterator iElemento0 = elemento0.iterator();
Iterator iElemento1 = elemento1.iterator();

El compilador no llega a poder verificar qué tipos contienen los Set, eliminamos la declaración de tipo de Iterator y dejamos que sea el compilador en tiempo dinámico quien lo determine.

Espero haberme explicado, saludos

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio! entrega CU00678B
« Respuesta #2 en: 16 de Agosto 2014, 21:45 »
 Hola javi!
He implementado cambios en el código según tu comentario, pude notar que el warning guardaba relacion solo con la declaración del tipo de elemento a recorrer en cada Iterator.
En cuanto a las declaraciones como:
Código: [Seleccionar]
HashSet<String> universo = new HashSet<String>();
TreeSet<Integer> numeros = new TreeSet<Integer>();
a pesar de que no gualdan relacion con el warning entiendo que es preferible declarar:
Código: [Seleccionar]
Set<String> universo = new HashSet<String>();
Set<Integer> numeros = new TreeSet<Integer>();
puesto que se nota el polimorfismo.
Muchas gracias por ayudarme con este warning, la verdad desconocía el motivo de este y mucho mas, desconocía como eliminarlo.
Saludos javi.
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".