Ir al contenido principal

La herejia de los generics

Como parte de las novedades incluidas en Java 5, contamos con los generic, genéricos emplantillados, que permiten realizar el tipado de métodos, colecciones, etc.
Sin embargo, me parece ridículo que algo tan básico como el polimorfismo, no este soportado en esta pobre implementación, veamos un ejemplo para entender mi argumento de mejor manera:

Consideremos las clases:

public class SuperClass {

}

public class SubClass extends SuperClass {

}

Y consideremos las clase generic, MyList que extiende de ArrayList, convenientemente emplantillada para limitar el acceso a solo objetos que extiendan de SuperClass:

public class MyList<t extends SuperClass> extends ArrayList<t> {


private static final long serialVersionUID = -2733586086914849461L;

public MyList() {
}

public MyList(int initialCapacity) {
super(initialCapacity);
}

public MyList(Collection c) {
super(c);
}

}

Hasta aquí, todo de maravilla, ahora intentemos utilizar esta nueva clase:

private static void getList () {

MyList<subclass> list1 = new MyList<subclass> (); // valido
MyList<superclass> list2 = new MyList<superclass> (); // valido
MyList<superclass> list3 = new MyList<subclass> (); // invalido
}

Como ven cuando el tipo y la instancia de la colección, son del mismo tipo de objeto, los genéricos funcionan, sin embargo cuando se intenta hacer que las instancias de la implementación de la colección sean genéricos, nos damos cuenta que no lo soportan, lo cual limita mucho el poder de los genéricos en Java.

No todo en el lado de la luz, es hermoso....

Comentarios

Gabriel Solano dijo…
Buena observación. Habría que preguntarse si hubo alguna razón lógica para no permitir ese "matrimonio" entre las plantillas y el poliformismo.
jsanca dijo…
Me parece que no es mas que un error en la implementación, pues no le encuentro ninguna lógica.

Entradas más populares de este blog

Pasos para remover Postgresql 8.3 en MAC OS

Tomado de: http://forums.enterprisedb.com/posts/list/1437.page In Mac OSX: (Assuming Default Locations) Via uninstaller: 1) In the installation directory, there will be a uninstall-postgresql.app file will be there, executing (double clicking) that will uninstall the postgresql installation. Manual Uninstallation: 1) Stop the server sudo /sbin/SystemStarter stop postgresql-8.3 2) Remove menu shortcuts: sudo rm -rf /Applications/PostgreSQL 8.3 3) Remove the ini file sudo rm -rf /etc/postgres-reg.ini 4) Removing Startup Items sudo rm -rf /Library/StartupItems/postgresql-8.3 5) Remove the data and installed files sudo rm -rf /Library/PostgreSQL/8.3 6) Delete the user postgres sudo dscl . delete /users/postgres

Enrique Bunbury - 3 de Octubre 2009 - Heredia CR

Via periodico la nacion, me entero de este conciertazo: http://www.nacion.com/viva/2009/julio/29/viva2042768.html Ah esperar mas detalles y la venta de la entradas, "Para solo si me perdonas ..." EDIT ..... Via http://www.enriquebunbury.com/hellville.aspx (gracias a andres por su post) venta anticipada: Entradas a la venta a partir del 13 de agosto en: www.costaricaticket.com Por ahi estare anunciando, el 13 si las estan vendiendo!

Impensando acerca de las referencias en Java

Fue hace ya algún tiempo que pase un rato discutiendo con algunos compañeros acerca de si existe o no el paso por referencia; el discurso fue mucho hacia que en Java el comportamiento, en el supuestamente pasamos por referencia un objeto y por valor los objetos primitivos creo mucha polémica. Para ubicarnos en contexto veamos el siguiente ejemplo. public static void main(String[] args) { int value = 10; changeValue(value); System.out.println("value = " + value); User user = new User(); Name name = new Name(); user.setName(name); name.setName("jsanca"); name.setLastName("XXX"); user.setPassword("123queso"); System.out.println("user: " + user.getName().getName() + ", " + user.getName().getLastName() + ", " + user.getPassword()); changeValue1(user); System.out.println("user: " + user.getName().getName() + ", " + user.getName().getLastName() + ", " + user.ge...