En
main
(líneas 20 a 28), en la línea 23 se hace una llamada a
maximo
con los enteros
3
,
4
y
5
. Cuando el
compilador encuentra esta llamada, primero busca un método
maximo
que reciba tres argumentos de tipo
int
.
No hay un método así, por lo cual el compilador busca un método genérico que pueda utilizarse, y encuentra el
método genérico
maximo
. Sin embargo, recuerde que los argumentos para un método genérico deben ser de un
tipo de referencia. Por lo tanto, el compilador realiza la conversión autoboxing de los tres valores
int
en objetos
Integer
, y especifi ca que estos tres objetos
Integer
se pasen a
maximo
. Observe que la clase
Integer
(paquete
java.lang
) implementa a la interfaz
Comparable< Integer >
de tal forma que el método
compareTo
compara
los valores
int
en dos objetos
Integer
. Por lo tanto, los objetos
Integer
son argumentos válidos para el método
maximo
. Cuando se devuelve el objeto
Integer
que representa el máximo, tratamos de mostrarlo en pantalla con
el especifi cador de formato
%d
, el cual muestra un valor del tipo primitivo
int
. Así, el valor de retorno de
maximo
se muestra en pantalla como un valor
int
.
Hay un proceso similar que ocurre para los tres argumentos
double
que se pasan a
maximo
en la línea 25. Se
realiza una conversión autoboxing en cada valor
double
para convertirlo en un objeto
Double
y pasarlo a
maximo
.
De nuevo, esto se permite ya que la clase
Double
(paquete
java.lang
) implementa a la interfaz
Comparable<
Double >
. El objeto
Double
devuelto por
maximo
se imprime en pantalla con el especifi cador de formato
%.1f,
el cual muestra un valor del tipo primitivo
double
. Así, se realiza una conversión autounboxing en el valor de
retorno de
maximo
y se muestra en pantalla como un
double
. La llamada a
maximo
en la línea 27 recibe tres obje-
tos
String
, que también son objetos
Comparable< String >
. Observe que colocamos de manera intencional
el valor más grande en una posición distinta en cada llamada al método (líneas 23, 25 y 27), para mostrar que el
método genérico siempre encuentra el valor máximo, sin importar su posición en la lista de argumentos.
Cuando el compilador traduce el método genérico
maximo
en códigos byte de Java, utiliza el borrado (pre-
sentado en la sección 18.3) para reemplazar los parámetros de tipo con tipos reales. En la fi gura 18.3, todos los
tipos genéricos se reemplazaron con el tipo
Object
. En realidad, todos los parámetros de tipo se reemplazan con
el límite superior del parámetro de tipo; a menos que se especifi que lo contrario,
Object
es el límite superior
predeterminado. El límite superior de un parámetro de tipo se especifi ca en la sección de parámetros de tipo.
Para indicar el límite superior, coloque después del nombre del parámetro de tipo la palabra clave
extends
y el
nombre de la clase o interfaz que representa el límite superior. En la sección de parámetros de tipo del método
maximo
(fi gura 18.5), especifi camos el límite superior como el tipo
Comparable< T >
. Por ende, sólo pueden
pasarse objetos
Comparable< T >
como argumentos para
maximo
; cualquier cosa que no sea
Comparable< T >
producirá errores de compilación. La fi gura 18.6 simula el borrado de los tipos del método máximo, al mostrar
el código fuente del método después de eliminar la sección de parámetros de tipo, y después de que se reemplaza
Figura 18.6
| El método genérico
maximo
, después de que el compilador realiza el borrado.
1
public static
Comparable maximo(Comparable x, Comparable y, Comparable z)
2
{
3
Comparable max = x;
// suponga que al principio x es el más grande
4
5
if
( y.compareTo( max ) >
0
)
6
max = y;
// y es el mayor hasta ahora
7
8
if
( z.compareTo( max ) >
0
)
9
max = z;
// z es el mayor
10
11
return
max;
// devuelve el objeto más grande
12
}
// fin del método maximo
18.4 Cuestiones adicionales sobre la traducción en tiempo de compilación: métodos que utilizan...
769
Figura 18.5
| El método genérico
maximo
, con un límite superior en su parámetro de tipo. (Parte 2 de 2).
Maximo de 3, 4 y 5 es 5
Maximo de 6.6, 8.8 y 7.7 es 8.8
Maximo de pera, manzana y naranja es pera
18_MAQ_CAP_18_DEITEL.indd769
4/19/081:30:44AM