La introducción
de clases genéricas en java es tardía y adolece de algunas importantes
limitaciones derivadas de la necesidad de hacer compatible el código creado con
anterioridad. La siguiente relación no pretende explicar por qué, sólo constata
las limitaciones.
problema |
ejemplo |
No se pueden
crear objetos de un tipo formal. |
new T(); |
No se pueden
crear arrays de tipos formales. |
new T[100] |
No se pueden
sobrecargar métodos usando tipos formales. |
class
X<T, S> { void metodo(T t) { ... } void metodo(S t) { ... } } |
No se puede
usar el operador instanceof |
if
(x instanceof T) |
Los campos y
métodos static (de clase) no pueden referirse a un tipo formal. (*) |
static
T t; static
T metodo(T t) { ... } |
Los tipos
enumerados no admiten tipos formales. |
enum Z<T> { A, B, C } |
Las excepciones
no admiten tipos formales. |
class
E<T> extends Exception { } |
Aunque T2 sea
un subtipo de T1, |
|
(*) Los
tipos genéricos pueden tener campos y métodos static, con la única
salvedad de que no se refieran al tipo formal de la clase. Si un método
estático se desea que sea genérico, hay que recurrir a métodos genéricos.
El asunto de los arrays
de tipo formal es especialmente insidioso: no se puede declarar un array de un
tipo formal; hay que declararlo de tipo Object y aplicar downcasting.
Object[] datos = new Object[...];
T x = (T) datos[...];
o
T[] datos = (T[])new Object[...];
T x = datos[...];
Temas relacionados
83. Genéricos [generics] (concepto)