JuanCri.com

domingo 4 de noviembre, 2007 a las 01:37

Uno de los argumentos más comunes del mundillo Java para justificar su "implementación" (note las ") es la compatibilidad hacia atrás. Esta compatibilidad va por dos lados: En primero lugar, el código escrito para máquinas virtuales anteriores a 1.5 puede ser compilado en las nuevas, utilizando las clases comunes entre las versiones como ArrayList no genérica y otros. Por otro lado, también se busca que, si una biblioteca antigua recibe un ArrayList (o cualquier otra clase que tenga su par genérica), se pueda enviar una lista genérica haciéndose automáticamente la conversión (casting).

En el caso de la CLI, al ser ArrayList y ArrayList<T> [ver nota al pie] dos clases diferentes (ArrayList y ArrayList`1), el primer punto se cumple. Todo el código antiguo (para 1.0 ó 1.1) que utiliza ArrayList puede compilarse sobre 2.0. Para el segundo punto, no se cumple diréctamente, pero no es difícil solucionarlo (por lo menos en el caso de las listas). Cuando una biblioteca antigua recibe un ArrayList y tenemos disponible una lista genérica, nos bastará con hacer esto:

codigoAntiguo.Lista = new ArrayList (listaGenerica);

¡Vamos, no es tan difícil! Ahora, estamos asumiendo que la clase genérica de listaGenerica implementa IList. Con esto no obligamos a la biblioteca legacy a recibir siempre IList. Pero si lo hiciera, sería mucho más simple para nosotros. List <T> en 2.0 implementa tanto IList como IList <T>. Así, basta con:

codigoAntiguo.Lista = listaGenerica;

Esto lo hemos comprobado en algunos tests, pero no creo que sea necesario publicarlos. Nota Sobre ArrayList <T>: En realidad, esta clase no existe y no entiendo la razón. Debo admitir que, en este caso, debió crearse ArrayList <T> y no List <T>, ya que ésta última no aclara el tipo de implementación de la lista (linked list, array list, etc).

Creative Commons License
Blog JuanCri.com por Juan Cristóbal Olivares licenciado bajo la Creative Commons Attribution 2.0 Chile License.
Mono PostgreSQL

JuanCri.com