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...
Comentarios
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.
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];
He puesto un post que explica por qué no se puede hacer lo que Wilfredo quiere en Java.
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
. 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.
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
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.
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
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.
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).
#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,
#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.