martes, enero 20, 2009

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....

2 comentarios:

Gabriel S. 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.