Desde la vista de usuario son grandes las ventajas de consumir una librería desarrollada sobre Generics a una que no lo hace, entre las que se encuentra una mayor limpieza en el código (lo que lleva a una mejora sustancial a la hora de comprender el mismo) y la posibilidad de trasladar errores de tipo en tiempo de ejecución (ClassCastException) a tiempo de compilación. Collection lo demuestra, por ejemplo al poder utilizar un Map adaptado a nuestras necesidades con solo indicar los tipos de la llave y del contenido.
Los problemas aparecen para muchos desarrolladores al pararse enfrente, al implementar librerías mediante Generics, llegando varios a pensar que la razón por la cual no consiguen materializar sus soluciones es porque realmente hay algo extraño detrás de la implementación misma de Generics dentro de la JVM. Sin embargo, se pueden observar dos factores en común en casi todos los problemas:
Generics simplemente pretende (además de proveer las ventajas para el usuario ya comentadas) permitirle al desarrollador abstraer de tipos su API, de forma que sea el usuario quien decida los que más le convengan.
La utilización lleva aparejado un estudio de las ventajas que realmente traerá al usuario y de ser este positivo, no hay duda que el tiempo a utilizar para la adaptación del API será tiempo realmente bien invertido.
Etiquetas: otro, soloprogramadores, opinion
Pregunta, esto funciona en Generics
Miclase { .....
Typo2 extends Typo1 { ....
someMethod () {
return new Miclase ();}
Deberia funcionar o es una manera inadecuada de utilizar los generics?
Si, eso funciona, se escribira asi:
class MiClase < T extends Persona > {
doSomething(T){}
}
Coincido totalmente con la opinión. El problema no son los generics, sino los problemas que uno se encuentra al querer crear una librería con ellos.
Generics debería facilitar el uso de los APIs, no complicarlo. Siempre se pueden utilizar partes de generics para realizar apis que más cómodas de utilizar, como la posibilidad de realizar "autocast".
//Esto es tan sólo un ejemplo, no pretende ser ningún API existente, sólo que "suene"
public ContextImpl implements Context {
[...]
public T getAttribute(String name) {
return (T)attributes.get(name);
}
[...]
}
De tal modo que podamos hacer:
public void ejecutar(Context ctx) {
Integer iteraciones = ctx.getAttribute("iteraciones"); //Se hace "autocast" a Integer
Callback metodo = ctx.getAttribute("metodo"); //"Autocast" a Callback
[...]
}Esta es posíblemente la característica más simple de "implementar" de los generics y consigue que desarrollar con ciertas librerías sea bastante más cómodo.
El problema aparece cuando se intenta ir más allá de las posibilidades propias o de generics. Lo que generalmente termina en un uso incorrecto y un API engorroso, ya he tenido que hacer más de una "parada de carro" y rehacer algunas APIs por conseguir precisamente el resultado opuesto al deseado, complicar las cosas.
Saludos.
¡Vaya hombre! El formateador ha vuelto a hacer de las suyas, donde pone:
public T getAttribute(String name) {Debería aparecer: public <T> T getAttribute(String name) {
¿Ese ejemplo que has puesto funciona? No veo donde le dices que T puede ser Integer o Callback... o cualquier otra cosa. De todas formas, en este caso, si solo es para no tener que escribir un cast, no le veo la ganancia.
Funcionar funciona. Los métodos con esa "signature" hacen cast al tipo de dato en el que se intenta asignar el valor devuelto por el método.
Lo de la ganancia, como dije, es muy pequeña, sólo "ahorras" el cast, no detectaría errores en tiempo de compilación, pero bueno, sólo era un ejemplo de cómo hacer que un API sea más cómodo de utilizar con un pequeñísimo toque de generics.
Saludos.Curioso, curioso. Gracias por la información. Sabiendolo, aun me parece más cochinada :P, pero es bueno conocerlo por si te lo encuentras por ahí. Anular los chequeos de compilación para no tener que escribir un cast... para eso es mejor usar un lenguaje estilo Groovy y dejarse de guarradas.
¡Jajaja! Pues debo de ser el cochino más cochino del corral, porque no le veo nada malo :P.
Escribe tu comentario