Java LanguageGenéricos


Introducción

Los genéricos son una instalación de programación genérica que extienden el sistema de tipos de Java para permitir que un tipo o método opere en objetos de varios tipos mientras proporciona seguridad de tipo de tiempo de compilación. En particular, el marco de colecciones Java es compatible con los genéricos para especificar el tipo de objetos almacenados en una instancia de colección.

Sintaxis

  • class ArrayList <E> {} // una clase genérica con parámetro de tipo E
  • clase HashMap <K, V> {} // una clase genérica con dos parámetros de tipo K y V
  • <E> void print (elemento E) {} // un método genérico con el parámetro de tipo E
  • ArrayList <String> nombres; // declaración de una clase genérica
  • ArrayList <?> Objetos; // declaración de una clase genérica con un parámetro de tipo desconocido
  • nueva ArrayList <String> () // creación de instancias de una clase genérica
  • nueva ArrayList <> () // creación de instancias con inferencia de tipo "diamante" (Java 7 o posterior)

Observaciones

Los genéricos se implementan en Java a través del borrado de tipos, lo que significa que durante el tiempo de ejecución la información de tipo especificada en la creación de instancias de una clase genérica no está disponible. Por ejemplo, la declaración List<String> names = new ArrayList<>(); produce un objeto de lista desde el cual el tipo de elemento String no se puede recuperar en tiempo de ejecución. Sin embargo, si la lista se almacena en un campo de tipo List<String> , o se pasa a un parámetro de método / constructor de este mismo tipo, o se devuelve desde un método de ese tipo de retorno, entonces la información de tipo completo se puede recuperar en tiempo de ejecución a través de la API de reflexión de Java.

Esto también significa que cuando se realiza la conversión a un tipo genérico (por ejemplo: (List<String>) list ), la conversión es una conversión sin verificar . Debido a que el parámetro <String> se borra, la JVM no puede verificar si una conversión de una List<?> una List<String> es correcta; La JVM solo ve un reparto de List a List en tiempo de ejecución.

Genéricos Ejemplos relacionados