limitaciones de las clases genéricas en java

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,
<T2> no es 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)