Ingresar:

programacion java :: Blog :: Generics en arreglos

February 27, 2007

Acabo de enfrentarme a un problema al trabajar con los tipos paramétricos en JAVA, esto trabajando con los arreglos, pues me tope con el detalle de que en el caso que les presento, no se puede eliminar el warning (@SuppressWarning("uncheked")). Hasta donde vi es un bug, pero si alguien conoce sobre esto ... le agradeceria mucho... He trabajado con la version de java 1.5:0_07-b03

public class Prueba<T> {     private A<T>[] arreglo;         public Prueba( int t ){         //   en realidad deberia ser arreglo = new A<T>[t];  pero no compila         arreglo = new A[t];     } }   class A<T>{     private T dato;         public void mostrar(){         System.out.println("El valor es: "+dato);     } }   

Aún no he visto si en la version 6 de JAVA han mejorado esto... 

Palabras clave: arreglos, generics, java

Enviado por Wilfredo Vargas Almendras @ programacion java



Comentarios

Página: 1 2
  1. Esto es medio raro ... el arreglo no debiera permitir genericidad. Para mi un arreglo es una instancia de algo genérico, debiera desaparecer con el tiempo. Un arreglo es para los tipos genéricos lo que los tipos primitivos son a las clases ...

    Cuando encuentro estos errores raros lo que me pongo a pensar primero es si mi estructura tiene sentido. Tal vez si nos cuentas un poco más sobre la necesidad y uso de tu estructura podemos ayudar, no siempre encontrando el error, pero tal vez proveyendo una solución alternativa que conceptualmente sea más adecuada. El contexto es importante para entender el problema. 

    user iconPablo Azero on Tuesday, 27 February 2007, 18:06 BOT # |

  2. Bueno .. es para explicar la parte de arboles N-arios, implementado con arreglos, traere una implementacion, y pues se que de otra forma se puede hacer mejor esto .... pero en el código que publicaré, se verá esta necesidad :) ... Además se que se puede aplicar a muchas cosas (bueno obviando de que puedo utilizar estructuras dinámicas ..etc,etc).. pero bueno .. preparo el material y lo posteo...

    user iconWilfredo Vargas on Tuesday, 27 February 2007, 19:08 BOT # |

  3. Me parece que es parte de la sintaxis de Java que para declarar un arreglo de genéricos se haga de esta manera:

     

    A<T> arreglo[];

     

    Pero para definir al arreglo:

     

    arreglo = new A[tam];

    user iconCristian Denis Mamani Torres on Tuesday, 27 February 2007, 19:30 BOT # |

  4. Acabo de notar un detalle, cuando declaramos el arreglo con el parametro.. de hecho el arreglo ya es genérico ... mmm no habia pensado en ese detalle, creo q algo que me confundió es que a pesar de que no se pone el parametro a momento de definir el tamaño del arreglo, sale un warning, y pues usando el Eclipse me sugiere que añada el parámetro al definir el tamaño... es raro .. supongo que será un bug ... revisare la versión 1.6, quizas ya es un detalle corregido :). EN todo caso no es un error, simplemente creo el warning esta en "un mal lugar".

    user iconWilfredo Vargas on Tuesday, 27 February 2007, 19:41 BOT # |

  5. He puesto un post que explica por qué no se puede hacer lo que Wilfredo quiere en Java.
     

    user iconPablo Azero on Wednesday, 28 February 2007, 07:49 BOT # |

  6. Quisiera saber como se llega a ser un verdadero programador en java y es que leen mucho y pratican bastante que tipo de bibliografia utilizan? Quisiera ser un llevar a ser tan bueno o mejor que ustedes especialmente en cuanto se refiere POO. por favor si me pueden dar algunas paginas web.. o sitios donde pueda practicar y encontrar ejercicios de algoritmos y pseudocodigo para integrarme y ser javera....a pablo, wilfredo y denis muchos saludoss.. me interesa saber MAS... atte: SU ESTUDIANTE

    alessa on Saturday, 05 May 2007, 08:27 BOT # |

  7. No se si soy tan bueno programando como Cristian o Wilfredo, pero puedo decir que si quieres aprender bien Java ayuda:

    . tener los javadocs instalados (dormir con los javadocs)

    . tener acceso al tutorial de Java (no sé si está en castellano), se puede bajar de la pagina de Sun (dormir con el tutorial)

    . programar muchas horas por dia (dormir poco)

    . buscarse e intentar programar problemas cada vez m'as complejos (esta es la técnica para no dormir, o dormir y seguir soñando con los problemas)

    . aprender otros lenguajes de programación paradigmáticamente distintos (haskell es una buena idea)

    . tener muchas ganas de aprender, cueste lo que cueste

    Ayuda tener un hobby y con eso relajarse cuando uno no está programando. A algunos les gusta bailar, a otros hacer algun deporte, a otros leer, a otros la música, etc. A veces cuando un programa no sale, es buena idea concentrarse en otra cosa. Luego se puede volver al problema y aparecen cosas que uno no habia visto antes.

    user iconPablo Azero on Saturday, 05 May 2007, 15:45 BOT # |

  8. Eso del hobby es realmente bueno cuantas noches no pase programando con mi guitarra a lado una fiel compañera que 100pre me ayudo a enfocar bien las ideas.

    Hay que tener una disciplina increible, cuando tienes que programar tienes que programar y cuando tienes que divertirte tienes que divertirte pero hay que tomar en cuenta que es 1% inspiración y 99% sudor, yo por ejemplo me acostumbre a ser mucho mas productivo durante las noches no sé que sera que la inspiración me viene a esas horas xD

    La práctica hace mucho y mejor si haces problemas reales y no 100pre te centres en una sola respuesta trata de ver todas las que puedas.

    "Everything I know I learned by killing smart people and eating their brains" 

     tiene muchas interpretaciones

    user iconMarcelo Zambrana Villarroel on Saturday, 05 May 2007, 22:25 BOT # |

  9. Algo que realmente quisiera que exista en las siguientes versiones es una forma de hacer T.class cuando trabajas con clases genéricas. Al momento de realizar instrospección es muy necesario, especialmente si trabajas desarrollando frameworks.

    Busqué si existía algo, pero al parecer los comentarios que encontré en internet dan soluciones parciales e incompletos. Creo que necesitan mejorar ciertos aspectos de generics en Java, cosas como esa. 

    user iconFernando Javier Montaño Torrico on Monday, 07 May 2007, 10:15 BOT # |

  10. #6. Como dice el Dr Pablo debes practicar mucho. Los enlaces y la referencias que te da, son buenas. Personalmente desde mi experiencia te puedo comentar como le hice para aprender a programar. Primero recuerdo que mi docente nos dijo: "A partir de ahora tienen que ver y pensar en el mundo de los objetos". Y pues para hacer empece a relacionar todas las cosas que veia con clases y objetos. Tratando de identificar atributos y metodos para todo, te comento que al principio no me fue muy bien, pero ya despues la cosa mejoro. Entonces crei que era momento de llevar esas ideas al computador, gran problema.. no tenia maquina, asi que me quedaba a medios dias, o madrugadas en el labo (horas en las que esta vacio). Pero bueno no lograba mucho, pero luego tambien la cosa fue mejorando, y asi poco a poco construi lo mucho o poco que pueda saber :). Lo que quiero decir con toda esta historia es que despues de unos años de experiencia, te recomiendo lo siguiente:
    Tener todos los recursos disponibles, es importante: Una computadora donde practicar, un buen libro, textos, apuntes, ejemplos, etc. Pero lo mas importante son las ganas de aprender, superarse y demas, pues con eso bastara para que cada dia busques nuevas soluciones a los problemas, buscaras problemas mas complejos, preguntaras, y haras de todo :). Y pues para apoyarte estan tus docentes y auxiliares xD. Espero te sea de ayuda un poquito el haberte contado mi experiencia ...

    #9. Bueno no se .. creo que esto te puede servir de algo:

    http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html


     Lo que puedes hacer es:
    T d;
    ...
    d.getClass()
    Espero sea de ayuda .. xD

    user iconWilfredo Vargas on Monday, 07 May 2007, 11:22 BOT # |

  11. Gracias Wilfredo, pero no me ayuda mucho, ya que tu sugerencia (la cual ya habia visto antes) me obliga a tener un atributo en mi clase, cosa que definitivamente no es necesario.

    Un código de ejemplo (mostrado abajo), con algo que sería bueno tener respecto a generics (por supuesto que este código no compila) por eso indiqué que sería algo bueno tenerlo en Java.

    public class MyObject<T> {
     
    public void loadAll() {
    MyPersistenceDAO.loadAll(T.class);
    // ...
    }
     
    }

    En método loadAll recibe como parámetro una clase del tipo T, es decir, que cuando se defina un subtipo T, automáticamente ese código debería de funcionar, al llamar al método.

    En resumen, se debería de poder obtener la clase del tipo parametrizado <T>.

    Encontré algunas soluciones, como está, pero no resuelven el problema, por eso mencioné que sería bueno tenerlo incluido en Java.

    user iconFernando Javier Montaño Torrico on Monday, 07 May 2007, 14:05 BOT # |

  12. AH, bueno ... pense que lo necesitabas para otra cosa, quizá no le di mucha atención al detalle de lo útil que es esto para el desarrollo de frameworks. Y pues si ahora entiendo mejor tu necesidad. Y pues al parecer las soluciones hasta ahora propuestas no son del todo buenas. Quizas pueda ayudarte un poco más si contextualizar el problema, y que librerias o frameworks te estan obligando a utilizar este detalle.

    user iconWilfredo Vargas on Monday, 07 May 2007, 15:01 BOT # |

  13. #13 http://ajayu.memi.umss.edu.bo/rho/weblog/posteando-cdigo-fuente

    user iconRho on Monday, 07 May 2007, 15:16 BOT # |

  14. Te sirve esto?: 

    public class Ejemplo {       public static <E> Class<E> dameLaClase(E x)     {         Class<E> res;                  res = (Class<E>)x.getClass();                  return res;     }               public static void main(String[] args) {                  Class clase = dameLaClase("Java es poder");                 System.out.println(clase.getName());                  clase = dameLaClase(11);         System.out.println(clase.getName());                  clase = dameLaClase(true);         System.out.println(clase.getName());     } }  

    Rolando, no me funciona como lo explicas en tu post (POSTEANDO CÓDIGO FUENTE).    

    user iconCristian Denis Mamani Torres on Monday, 07 May 2007, 15:28 BOT # |

  15. #14, fixed

    user iconRho on Monday, 07 May 2007, 15:54 BOT # |

  16. Al fin ... ya funciona el formateador de codigo :). No estaba funcionando bien desde la ultima actualizacion del ajayu.

    user iconWilfredo Vargas on Monday, 07 May 2007, 16:10 BOT # |

  17. Ahora si...

    user iconCristian Denis Mamani Torres on Monday, 07 May 2007, 16:55 BOT # |

  18. #12,  no existe ningún framework que me esté obligando a utilizar ese detalle. Necesito eso para un framework que estoy desarrollando sobre JSF y JPA. El código que puse anteriormente para mí, es una manera clara y sencilla de como debería de hacerse, sin necesidad de añadir mas complejidad a ese código. Lamentablemente ahora, no se puede hacer eso en Java. Pero estoy seguro que mas adelante si, ya que ví varios posts similares en el foro de Java Sun.

    #13, Gracias por el post referente a postear código fuente. No lo había visto hasta ahora. Pero aprovecho la oportunidad par pedir que si fuere posible (si es que no existe ya, y yo me estoy rayando con esta solicitud por no haberlo encontrado) se añada una página con los "Tips/Tricks" de ajayu, mas específicamente un "FAQ" o un "How-to" en el cual se coloque ese tipo de información. Esto de seguro ayudará a muchos nuevos, en incluso antiguos de esta comunidad que no saben de dichos trucos.
    Por ejemplo hace tiempo atrás traté de colocar un video de youtube, ya antes había visto varios, entonces pensé "debe tener una ayuda que indique que tags puedo incluir en mi post"...busqué y busqué y no encontré nada (no se me imaginó siquiera buscarlo en un post, yo busqué en los links de del sitio), Si no hubiera sido porque conozco a otro miembreo de la comunidad, y éste me dio el tip (a él también se le había olvidado, por lo encontró) no hubiera podido colocar el post. Otro ejemplo es éste del código fuente, que recién me vengo a enterar que existe (gracias por informar).

    Espero que si no existe ese FAQ (yo no lo he encontrado) se pueda tener uno mas adelante.

     

    Gracias,

     

     

     

    user iconFernando Javier Montaño Torrico on Monday, 07 May 2007, 17:49 BOT # |

  19. #14, gracias por la sugerencia, pero no resuelve el problema.

    En fin, la idea de haber puesto ese código de ejemplo es para mostrar que poder tener un T.class (como mostré en mi código de ejemplo anterior) es necesario para lo que pretendí hacer. Simplemente fue para ilustrarles sobre el tema.

    Obviamente tuve que buscar otra solución al problema (tiempo atrás), una solución que no me parece buena debido que que involucra tener una instancia T como atributo, del cual obtengo el class, cosas que es innecesario según mi punto de vista, ya que no necesito ningún atributo, ya que se supone que T (el tipo parametrizado) siempre tendrá una clase, y debería ser posible poder utilizarlo de forma sencilla.

     

    user iconFernando Javier Montaño Torrico on Monday, 07 May 2007, 18:02 BOT # |

  20. Fernando: el problema de las genéricas en Java es que no son de verdad, solamente son sintaxis que desaparece en tiempo de compilación. Si haces el manejo de las clases a mano, para que el framework tenga suficiente generalidad, supongo que pierdes el control de los tipos que se hace en tiempo de compilación. Supongo que al nivel que quieres manejar esos tipos paramétricos se necesita conectar los tipos de la(s) clase(s) especializadas con la genericidad del framework. Como eso no se puede hacer en tiempo de compilación, es posible que necesites dejar algunas anotaciones de tipo en el bajo nivel (nivel JVM) y usar algunas instrucciones de introspección para recuperar esas anotaciones. Hay varios riesgos de por medio. Supongo que todo esto tal vez se puede eliminar si uno piensa en otros mecanismos de genericidad en el framework. Lo de la genericidad es nuevo en Java, entonces todavia hay mucho espacio por delante para explorar. Por ahora Java está bastante desordenado y feo, habrá que esperar evoluciones del lenguaje para recuperar la elegancia y simplicidad.

    user iconPablo Azero on Tuesday, 08 May 2007, 08:01 BOT # |

Página: 1 2

Añadir un comentario

Tu texto de comentario

Tu nombre

Por favor ingresa el código de la imagen

Security Code