En PC Resumen vamos a hablar de los genéricos crudos en Java. Los programas de prueba anteriores que hemos visto en el artículo Clases genéricas en Java, crean instancias de objetos Pila con los argumentos de tipo Double y Integer. También es posible instanciar la clase genérica Pila sin especificar un argumento de tipo:
Pila pila = new Pila(5);
En este caso, se dice que pila tiene un tipo crudo, lo que significa que el compilador utiliza de forma implícita el tipo Object en la clase genérica para cada argumento de tipo. Así, la instrucción anterior crea una Pila que puede almacenar objetos de cualquier tipo. Esto es importante para la compatibilidad con versiones anteriores de Java.
A una variable Pila de crudo se le puede asignar una Pila que especifique un argumento de tipo:
Pila pilaTipoCrudo2 = new Pila<Double>(5);
Debido a que el tipo Double es una subclase de Object. La asignación se permite ya que los elementos son objetos.
De forma similar, a una variable Pila que especifica un argumento de tipo se le puede asignar un objeto Pila de crudo:
Pila<Integer> pilaInteger = new Pila(10);
Aunque esta asignación se permite no es segura debido a que una Pila de crudo podría almacenar elementos diferentes a Integer. En este caso, el compilador genera un mensaje de advertencia, el cual indica asignación insegura.
El programa de prueba siguiente utiliza la noción de tipo crudo. Si compilamos con la opción Xlint: Unchecked saldrán varios mensajes de advertencia ya que el compilador no puede garantizar que los tipos manipulados por las pilas sean correctos.
public class PruebaTipoCrudo {
private Double[] elementosDouble = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6};
private Integer[] elementosInteger = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
public void probarPilas() {
Pila pilaTipoCrudo1 = new Pila(5);
Pila pilaTipoCrudo2 = new Pila<Double>(5);
Pila<Integer> pilaInteger = new Pila(10);
probarApilar("pilaTipoCrudo1", pilaTipoCrudo1, elementsDouble);
probarDesapilar("pilaTipoCrudo1", pilaTipoCrudo1 );
probarApilar("pilaTipoCrudo2", pilaTipoCrudo2, elementsDouble);
probarDesapilar("pilaTipoCrudo2", pilaTipoCrudo2);
probarApilar("pilaInteger", pilaInteger, elementsInteger);
probarDesapilar("pilaInteger", pilaInteger);
}
public <T> void probarApilar(String nombre, Pila<T> pila, T[] elementos) {
try {
System.out.printf("\n Apilar elementos en %s \n", nombre);
for (T elemento: elementos) {
System.out.printf("%s", elemento);
pila.apilar(elemento);
}
} Catch (ExcepcioPilaLlena excepcioPilaLlena) {
System.out.println();
excepcioPilaLlena.printStackTrace();
}
}
public <T> void probarDesapilar(String nombre, Pila<T> pila) {
try {
System.out.printf("\n Desapilando elementos de %s \n", nombre);
T valorAQuitar;
while (true) {
valorAQuitar = pila.desapilar ();
System.out.printf("%s", valorAQuitar);
}
} Catch (ExcepcioPilaVacia excepcioPilaVacia) {
System.out.println();
excepcioPilaVacia.printStackTrace();
}
}
public static void main(String args[]) {
PruebaTipoCrudo aplicacion = new PruebaTipoCrudo();
aplicacion.probarPiles ();
}
}