PruebaTipoCrudo.java:20: warning: unchecked assignment
found   : Pila
required: Pila<java.lang.Integer>

Pila< Integer > pilaInteger = new Pila( 10 );

^

PruebaTipoCrudo.java:22: warning: [unchecked] unchecked method invocation: 
<T>probarPush(java.lang.String,Pila<T>,T[]) in PruebaTipoCrudo is applied to 
(java.lang.String,Pila,java.lang.Double[])

probarPush( “pilaTipoCrudo1”, pilaTipoCrudo1, elementosDouble );
^

PruebaTipoCrudo.java:23: warning: [unchecked] unchecked method invocation: 
<T>probarPop(java.lang.String,Pila<T>) in PruebaTipoCrudo is applied to (
java.lang.String,Pila)

probarPop( “pilaTipoCrudo1”, pilaTipoCrudo1 );
^

PruebaTipoCrudo.java:24: warning: [unchecked] unchecked method invocation: 
<T>probarPush(java.lang.String,Pila<T>,T[]) in PruebaTipoCrudo is applied to 
(java.lang.String,Pila,java.lang.Double[])

probarPush( “pilaTipoCrudo2”, pilaTipoCrudo2, elementosDouble );
^

PruebaTipoCrudo.java:25: warning: [unchecked] unchecked method invocation: 
<T>probarPop(java.lang.String,Pila<T>) in PruebaTipoCrudo is applied to 
(java.lang.String,Pila)

probarPop( “pilaTipoCrudo2”, pilaTipoCrudo2 );
^

5 warnings

Figura 18.13

  |  Mensajes de advertencia del compilador.

generan advertencias debido a que el método 

probarPop

 espera como argumento una 

Pila

 para la cual se haya 

especifi cado un argumento de tipo. Sin embargo, en cada llamada a 

probarPop

, pasamos una variable 

Pila

 de 

tipo crudo. Por ende, el compilador indica una advertencia, debido a que no puede comprobar los tipos utilizados 
en el cuerpo del método.

18.8 Comodines en métodos que aceptan parámetros de tipo

En esta sección presentaremos un poderoso concepto de los genéricos, conocido como los 

comodines

. Para este 

fi n, también introduciremos una nueva estructura de datos del paquete 

java.util

. El capítulo 19, Colecciones, 

habla sobre el Marco de trabajo Collections de Java, el cual proporciona muchas estructuras de datos genéricas y 
algoritmos que manipulan a los elementos de estas estructuras de datos. Tal vez la más simple de estas estructuras 
de datos sea la clase 

ArrayList

: una estructura de datos tipo arreglo, que puede cambiar su tamaño en forma 

dinámica. Como parte de esta discusión, aprenderá a crear un objeto 

ArrayList

, a añadirle elementos y a recorrer 

esos elementos mediante el uso de una instrucción 

for

 mejorada.

Antes de presentar los comodines, analicemos un ejemplo que nos ayude a motivar su uso. Suponga que desea 

implementar un método genérico llamado 

suma

, que obtenga el total de números en una colección, como en un 

objeto

ArrayList

. Para empezar, podría insertar los números en la colección. Como sabe, las clases genéricas sólo 

se pueden utilizar con tipos de clases o de interfaces. Por lo tanto, se realizaría una conversión autoboxing de los 
números a objetos de las clases de envoltura de tipos. Por ejemplo, cualquier valor 

int

 se convertiría mediante 

autoboxing en un objeto 

Integer

, y cualquier valor 

double

 se convertiría mediante autoboxing en un objeto 

Double

. Nos gustaría poder obtener el total de todos los números en el objeto 

ArrayList

, sin importar su tipo. 

Por esta razón, declaramos el objeto 

ArrayList

 con el argumento de tipo 

Number

, el cual es la superclase tanto 

de

Integer

como de 

Double

. Además, el método 

suma

 recibirá un parámetro de tipo 

ArrayList< Number >

y obtendrá el total de sus elementos. En la fi gura 18.14 se demuestra cómo obtener el total de los elementos de 
un objeto 

ArrayList

 de objetos 

Number

.

En la línea 11 se declara e inicializa un arreglo de objetos 

Number

. Como los inicializadores son valores 

primitivos, Java realiza conversiones autoboxing en cada valor primitivo, para convertirlo en un objeto de su 
correspondiente tipo de envoltura. Los valores 

int 1

y

3

 se convierten mediante autoboxing en objetos 

Integer

,

18.8 Comodines en métodos que aceptan parámetros de tipo 

783

18_MAQ_CAP_18_DEITEL.indd783

4/19/081:30:51AM